#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; и теперь он не выдает никаких ошибок, но и не сохраняет никаких данных… Однако это шаг вперед.