Я пишу приложение с двумя таблицами на одном экране. Стол, из-за которого встают, является списком папок, и правильная таблица показывает список файлов. При ответвлении на строке слева правильная таблица покажет файлы, принадлежащие той папке.
Я использую Базовые Данные для устройства хранения данных. Когда выбор изменений папки, предикат выборки NSFetchedResultsController правильной таблицы изменит и выполнит новую выборку, затем перезагрузит данные таблицы. Я использовал следующий фрагмент кода:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list];
[fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[table reloadData];
Однако результатами выборки является все еще то же. У меня есть "предикат" NSLog'ed прежде и после выборки, и они были корректны с обновленной информацией. Результаты выборки остаются такими же как начальная выборка (когда представление загружается).
Я не очень знаком с путем объекты выборок Данных Ядра (там кэширующаяся система?), но я сделал подобные вещи прежде (изменяющиеся предикаты, перевыбирающие данные и обновляющая таблица) с единственными табличными представлениями, и все подходило.
Если бы кто-то мог, дал мне подсказку, я очень ценился бы.
Заранее спасибо.
У меня была почти такая же проблема, пока я не нашел подсказку в недавнем сообщении в блоге на iphone incubator
NSFetchedResultsController кэширует первые результаты. (Вероятно, у вас что-то установлено в initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName)
Я предполагаю, что ваш код (как и мой) является производным от образца CoreData, поэтому, предполагая, что это @ "Root", прежде чем вы измените предикат, do a
[NSFetchedResultsController deleteCacheWithName:@"Root"];