Использование modalView для сохранения данных через CoreData

#iphone #ios #core-data #modalviewcontroller

#iPhone #iOS #core-данные #modalviewcontroller

Вопрос:

Мое приложение — это просто база данных, в которой пользователь просто ищет некоторые научные данные. Он построен следующим образом:

— Он должен выбирать «основные» представления с помощью TabBarViewController. -В первом представлении пользователь просто переходит к поисковому запросу. -Во втором представлении представлены лишь некоторые настройки, информация и отказ от ответственности.

Я использовал второе представление для предварительного заполнения базы данных, которая будет отправлена вместе с приложением. Теперь, когда он заполнен, я собираюсь фактически реализовать настройки, информацию и так далее.

managedObjectContext настраивается в AppDelegate (applicationDidFinish …) следующим образом:

  firstViewViewController.managedObjectContext = self.managedObjectContext; 
secondViewController.managedObjectContext = self.managedObjectContext;
saveCustom.managedObjectContext = self.managedObjectContext;

self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];

return YES;
  

managedObjectContext объявлен и правильно синтезирован во SecondViewController.

Приложение пока работает нормально, и я могу сохранять элементы в БД.

Теперь я создал modalView, который вызывается из FirstViewController. Я хочу, чтобы пользователь мог сохранять пользовательские данные. Для этого я продублировал то, что я сделал в seconViewController, и добавил соответствующий код (или то, что я думаю, что это) в AppDelegate (см. Выше).

Когда я пытаюсь сохранить данные с помощью modalView, я получаю следующую ошибку.

* Завершение работы приложения из-за неперехваченного исключения ‘NSInternalInconsistencyException’, причина: ‘ entityForName: не удалось найти NSManagedObjectModel для имени объекта XXX

где XXX — правильное имя моего объекта.

Я знаю, что это связано с тем, что managedObjectContext не инициализируется. Но я не понимаю, почему это работает на seconViewController, а не на modalViewController.

Итак, как я могу заставить это работать?

Я знаю, что импорт AppDelegate в modalView, хотя это и сработало бы, не является хорошей практикой.

Заранее спасибо!

Редактировать:

Код, который я использую для сохранения данных, выглядит следующим образом:

 -(void)saveDataToCD{

NSString *entityString=[NSString stringWithFormat:@"%@",[arrayAdquiritDelMV objectAtIndex:1]];
NSString *deltaString=[NSString stringWithFormat:@"%@",[arrayAdquiritDelMV objectAtIndex:3]];





    NSManagedObjectContext *context = [self managedObjectContext];

    NSManagedObject *pepe = [NSEntityDescription insertNewObjectForEntityForName:entityString inManagedObjectContext:context];  // aqui un string
    [pepe setValue:assigment.text forKey:@"definition"];
    [pepe setValue:impurity.text forKey:@"impurity"];
    [pepe setValue:[NSNumber numberWithDouble:[delta.text doubleValue]] forKey:deltaString];  //aquí un string


    NSError *error;


    if (![context save:amp;error]) 
    {
        NSLog(@"Problem saving: %@", [error localizedDescription]);
    }}
  

Редактировать # 2, вот как я называю модальное представление:

 -(IBAction)saveCustom:(id)sender{

if(saveCustomController == nil)
{
    SaveCustom *viewTwo = [[SaveCustom alloc] initWithNibName:@"SaveCustom" bundle:[NSBundle mainBundle]];
    self.saveCustomController = viewTwo;

    [viewTwo release];
}

[self presentModalViewController:self.saveCustomController animated:YES];
  

}

Комментарии:

1. можете ли вы опубликовать код, который вы используете, чтобы попытаться добавить NSManagedObjects?

2. дважды проверьте, что MOC, который вы используете в saveCustomerController, просматривает ту же модель и постоянное хранилище, что и ваш другой контроллер просмотра и делегат приложения.

Ответ №1:

Из того, что вы описываете, это выглядит не так, но попробовать все же стоит.

Вы изменили свою модель Core-Data с момента запуска приложения?
Если да, вам нужно зайти в папку вашего приложения и удалить файл резервной копии Core-Data.
Поскольку теперь он не синхронизирован с вашей моделью, core data не знает, что с ним делать.

Единственное сомнение, которое у меня есть, это то, что я бы получил эту ошибку при запуске своего приложения после модификации, а не 2 или 3 просмотра позже.


Как вы представляете это представление модально, где вы его создаете и где вы устанавливаете контекст для этого представления, которое вы представляете модально?


вы забываете указать UIViewController, какой контекст использовать.

 if(saveCustomController == nil)
{
SaveCustom *viewTwo = [[SaveCustom alloc] initWithNibName:@"SaveCustom" bundle:[NSBundle mainBundle]];
self.saveCustomController = viewTwo;

[viewTwo release];
}

[self presentModalViewController:self.saveCustomController animated:YES];
  

Вам не хватает строки, подобной этой

 viewTwo.managedContext = aManagedContext;
  

Когда вы делаете это в applicationFinised … ваш экземпляр еще не существует.
И в Obj-C вы можете отправить сообщение на nil, оно просто будет проигнорировано, вы не потерпите крах, как на другом языке.

Комментарии:

1. Подождите, что я сделал, так это немного поработал над кодированием в моем ноутбуке вместо моего рабочего стола, но я не напортачил с core data при работе на ноутбуке. Вы имеете в виду удалить папку приложения в симуляторе iPhone?

2. Возможно, это сработало бы, но я имел в виду файл core data, подобный этому: ~ Library / Application Support /iPhone Simulator/4.3.2/Applications/99859124-D963-4FB2-9D59-1408xxxxxxxx/Documents/Simple_Addresse_Book.sqlite

3. Да, так вы имеете в виду фактический файл DB в симуляторе. Да, я удалил это и начал заново. Не работает. Очень жаль.

4. Удалите всю папку вашего приложения из симулятора — это, по моему опыту, очень часто является причиной исключений в измененных моделях данных.

5. Я добавил эту строку: viewTwo.managedObjectContext= managedObjectContext; и теперь он не выдает никаких ошибок, но и не сохраняет никаких данных… Однако это шаг вперед.