Сохранение основных данных из нескольких таблиц - PullRequest
0 голосов
/ 01 июня 2011

У меня есть приложение с несколькими представлениями таблиц, и я хочу использовать базовые данные для сбора всех данных. У меня есть две сущности - морозильные камеры и предметы. В первом табличном представлении я добавляю морозильник, и он сохраняется правильно. Я закрываю приложение, открываю заново, и оно там. Я нажимаю на морозильную камеру (открывая другой вид таблицы) и добавляю некоторые элементы, и я вижу их в моем новом секционном виде. Я закрываю свое приложение, перезагружаю его, вижу морозильник, нажимаю на него, и нет никаких предметов.

У меня есть свой managedObjectContext в моем appDelegate, и я ссылаюсь на него, используя все представления, поэтому я не создаю несколько экземпляров. Вот код, который я использую для сохранения элементов в морозильнике, как управляемогоObjectContext, так и моего itemsArray:

Item *item = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:[delegate managedObjectContext]];
    [item setFreezer:freezerName];
    [item setName:name];
    [item setQuantity:quantity];
    [item setSection:section];
    [item setAdded:added];
    [item setNotes:notes];

    NSError *error = nil;
    if (![[delegate managedObjectContext] save:&error]) {
        NSLog(@"Freezer info didn't save.  Need to handle this.");
    }

    [items insertObject:item atIndex:0];

Вот код, который я использую в ItemViewController для извлечения элементов в viewDidLoad:

 NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"freezer == '%@'", freezerName];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:[delegate managedObjectContext]];
    NSSortDescriptor *sorts = [[NSSortDescriptor alloc] initWithKey:@"section" ascending:NO];
    NSArray *sort = [[NSArray alloc] initWithObjects:sorts, nil];

    [request setSortDescriptors:sort];
    [request setEntity:entity];
    [request setPredicate:predicate];

    NSError *error = nil;

    NSMutableArray *results = [[[delegate managedObjectContext] executeFetchRequest:request error:&error] mutableCopy];
    if(results == nil) {
        NSLog(@"Error fetching results... need to handle");
    }

    [self setItems:results];

    NSLog(@"items count:%d", [items count]);

Количество возвращенных предметов равно нулю.

Я совершенно ошарашен и потратил несколько часов на поиск в Интернете, пробуя разные вещи, и я не могу понять это. Я знаю, что есть более умные программисты, и я надеюсь, что один из вас поймет, в чем проблема.

Ответы [ 3 ]

0 голосов
/ 02 июня 2011

Возможно, проблема в том, что вы загружаете данные методом

- viewDidLoad:

.Он вызывается только один раз, когда загружается ваше представление, поэтому при смене подстилающих данных ваш контроллер представления не знает об этом.

Вы можете либо переместить код загрузки в метод

- viewWillAppear:

или ввести уведомления, чтобы распространять информацию о том, что хранилище данных изменило свое состояние, и перезагрузить представления таблицы при этом событии.

Вероятно, наилучшим способом является использование NSFetchedResultsController в качестве источника данных, поскольку он всегда осведомлен об изменениях своего хранилища данных,Проверьте документы для ссылки на этот класс.

0 голосов
/ 04 июня 2011

Итак, мои данные были сохранены правильно - я увидел это после того, как закомментировал предикат.Так что синтаксис моего предиката был неверным.Я провел поиск и нашел эту статью, которая работала для меня:

Запросы базовых данных с предикатами - iPhone

Я заменил LIKE на содержание [cd], и это работает!

0 голосов
/ 01 июня 2011

Я бы попытался изменить предикат на

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"freezer like %@", freezerName];

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...