Использование ModalView для сохранения данных через CoreData - PullRequest
0 голосов
/ 05 ноября 2011

Мое приложение - это просто БД, где пользователь просто ищет некоторые научные данные. Это построено так:

-Он должен иметь «основные» представления, выбираемые с помощью 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;

УправляемыйObjectContext объявлен и правильно синтезирован во втором ViewController.

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

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

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

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

где XXX - правильное имя моей сущности.

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

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

Я знаю, что импорт AppDelegate в modalView, хотя он и будет работать, не очень хорошая практика.

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

Edit:

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

-(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:&error]) 
    {
        NSLog(@"Problem saving: %@", [error localizedDescription]);
    }}

Edit # 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 Ответ

0 голосов
/ 06 ноября 2011

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

Изменили ли вы модель 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 вы можете отправить сообщение на ноль, оно будет просто проигнорировано,ты не потерпишь крах, как в другомэр язык.

...