Как обновить / перезагрузить, чтобы обновить изменения в моем предикате и, таким образом, получить запрос? - PullRequest
6 голосов
/ 18 октября 2011

Привет, у меня сейчас табличное представление, которое заполняется через Core Data.

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                                @"orderNumber == %@",     orderNumberLabel.text];
NSLog(@"predicate is: %@",predicate);
[fetchRequest setPredicate:predicate];

После заполнения формы для ввода ордера нажимается кнопка [сохранить ордер], а затем orderNumber увеличивается на единицу, а также orderNumberLabel.

Что я ожидаю, так это то, что tableView должен быть пустым, так как новый orderNumber не имеет записей в базе данных sql. Однако это не происходит и вызывает [myTableView reloadData]; тоже не разрешает.

Однако, если я выйду из проекта и перезапущу его, у меня будет новый orderNumber и пустой tableView. Так что во время выполнения происходит что-то с установленным запросом выборки и предикатом, которые мне нужно попробовать и повторить с помощью вызова в моем методе saveOrderButtonPressed. Единственная проблема в том, что я не знаю, как это сделать, может кто-нибудь помочь, пожалуйста?

Иногда я получаю следующую ошибку после выхода и повторного запуска приложения после ввода заказов. Это связано с тем, что я меняю orderNumber, но думаю, он исчезнет, ​​как только я обновлю предикат / fetchRequest. Мне также нужно некоторое руководство по этому вопросу, нужно ли отключить кэширование?

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason:'FATAL ERROR: The persistent cache of section information does not match 
the current configuration.  You have illegally mutated the NSFetchedResultsController's
fetch request, its predicate, or its sort descriptor without either disabling 
caching or using +deleteCacheWithName:'

Ответы [ 4 ]

7 голосов
/ 18 октября 2011

Вы вправе использовать NSFetchedResultsController. Это сделано именно для использования, которое вы описываете. Как говорится в сообщении об ошибке, вы можете установить кэш NSFetchedResultsController равным nil, чтобы полностью отключить кеширование - что не сильно ухудшает производительность, когда у вас так мало элементов. Или вы можете использовать +deleteCacheWithName: с именем, которое вы присвоили кешу. Только тогда вы можете изменить запрос на выборку (например, предикат), и тогда вы должны снова выполнить performFetch:. Надеемся, что вы подключили делегата, чтобы ваш табличный вид автоматически обновлялся. Вы не говорите, что делаете какие-либо вещи, которые могут вызвать проблемы (изменение предиката, порядок сортировки и т. Д.) - вы уверены, что это не так?

2 голосов
/ 07 ноября 2012

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

Исправление к этому состояло в том, чтобы вызвать executeFetch AND reloadDataviewWillAppear.Не очень эффективно, я знаю - мне нужно добавить механизм, который сделает это только тогда, когда данные действительно обновлены.

0 голосов
/ 14 января 2013

У меня была похожая ситуация, когда я хотел обновить таблицу с другим предикатом.

[tableView realoadData]

один не сделал этого, но благодаря подсказке

(fetchedResultsController != nil) { return fetchedResultsController; } 

Я заработал, очистив fetchResultsController перед перезагрузкой в ​​моем случае

_fetchedResultsController=nil;
[tableView reloadData];

Спасибо, msek!

0 голосов
/ 18 октября 2011

Вы хотите использовать NSFetchedResultsController для заполнения вашего tableView.

Вы можете реализовать методы NSFetchedResultsControllerDelegate, чтобы указать, как tableView должен обновляться в ответ на различные события.

NSFetchedResultsController отслеживает ваш fetchRequest в фоновом режиме и вызывает его методы делегата в ответ на события.

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