Сбой после сброса NSPersistentStore во время отслеживания NSFetchedResultsController изменен - PullRequest
3 голосов
/ 10 февраля 2012

Вот что я пытаюсь сделать:

  1. Я использую NSFetchedResultsController для выполнения выборки и отслеживания изменений с использованием его делегата
  2. Я загружаю некоторые данные и, в зависимости от некоторых условий, иногда удаляю все локальные данные, хранящиеся в CoreData, удаляя NSPersistentStore и воссоздая новый.
  3. Я создаю управляемые объекты на основе данных и сохраняю их
  4. NSFetchedResultsController теперь должен сообщить мне, что у меня есть некоторые изменения

Вместо этого я получаю сообщение об ошибке при попытке сохранить данные:

CoreData: ошибка: серьезная ошибка приложения. Исключение было обнаружено во время обработки изменений Core Data. Обычно это ошибка в наблюдателе NSManagedObjectContextObjectsDidChangeNotification. Постоянное хранилище объекта недоступно из этого координатора NSManagedObjectContext с userInfo (null)

Я всегда использую один NSManagedObjectContext и всегда читаю и сохраняю в главном потоке.

Кажется, что переключение NSPersistenStore каким-то образом портит контроллер результатов выборки. Это ожидаемое поведение или я делаю что-то не так?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

Я бы не рекомендовал такой подход. Я хотел бы создать новый MOC с вашим новым постоянным магазином и отпустить старый MOC.

Полагаю, в какой-то момент вы позвоните -[ManagedObjectContext reset]? Прежде чем сделать это, вы должны отпустить все управляемые объекты, которые происходят из этого контекста. Все они становятся недействительными (что, вероятно, является причиной вашего сбоя).

Вам также следует взглянуть на Как заставить coredata перестроить модель базы данных sqlite? .

2 голосов
/ 28 апреля 2012

У меня был такой же сбой.Следуя совету Роба, я дополнительно отправлял NSNotification каждый раз, когда вызывал removePersistentStore: - и все мои ViewController, имеющие NSFetchedResultController, теперь автоматически обнуляют свой локальный NSFetchedResultsController, когда это происходит.

, то есть:

1- СЛУШАТЬ УВЕДОМЛЕНИЕ:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
    // Custom initialization
    [[NSNotificationCenter defaultCenter] addObserverForName:kNotificationDestroyAllNSFetchedResultsControllers object:nil queue:nil usingBlock:^(NSNotification *note) {
        NSLog(@"[%@] must destroy my nsfetchedresultscontroller", [self class]);
        [__fetchedResultsController release];
        __fetchedResultsController = nil;
        }];
    }
    return self;
}

2 - УВЕДОМЛЕНИЕ ПОЧТА

for( NSPersistentStore* store in [self.persistentStoreCoordinator persistentStores] )
{
    NSError *error;
    NSURL *storeURL = store.URL;
    [self.persistentStoreCoordinator removePersistentStore:store error:&error];
    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

    /** ... side effect: all NSFetchedResultsController's will now explode  */
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationDestroyAllNSFetchedResultsControllers object:self];
}
0 голосов
/ 26 апреля 2017

NSFetchedResultsController отслеживает изменения в объектах в связанном контексте управляемого объекта, поэтому он может отслеживать изменения в объектах в устаревшем контексте управляемого объекта.

Эта проблема была исправлена ​​после воссоздания NSFetchedResultsController после сброса NSPersistentStore

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