CoreData: замена .sqlite вызывает сбой - PullRequest
0 голосов
/ 05 марта 2012

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

NSArray *stores = [__persistentStoreCoordinator persistentStores];

for(NSPersistentStore *store in stores) {
    [__persistentStoreCoordinator removePersistentStore:store error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}
__persistentStoreCoordinator = nil;
[self persistentStoreCoordinator];

__managedObjectContext = nil;
[self managedObjectContext];

Все работает нормально,просто так, как это принято.Но когда я закрываю приложение с помощью кнопки «Домой», происходит сбой:

[NSPersistentStoreCoordinator retain]: message sent to deallocated instance

Я использую ARC ... на самом деле вы можете сказать, что это не имеет значения, потому что происходит сбой при закрытии, поэтому вы нене замечаю аварии.Но, конечно, это не вариант, и должен быть правильный способ сделать это!?

Есть идеи?Почему удержание отправляется на NSPersistenStoreCoordinator?Он имеет отношение к __persistentStoreCoordinator = nil;, но мне нужно его обнулить, иначе он не использует новый .sqlite.

Cheers!

1 Ответ

3 голосов
/ 07 марта 2012

Ну, в конце концов я нашел лучший (и работающий) способ заменить хранилище .sqlite & storeCoordinator, без необходимости обнулять persistentStoreCoordinator:

NSArray *stores = [__persistentStoreCoordinator persistentStores];

for(NSPersistentStore *store in stores) {
    [__persistentStoreCoordinator removePersistentStore:store error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}

NSString *storePath = [[self applicationDocumentsDirectoryString] stringByAppendingPathComponent:@"PictureApp.sqlite"];

NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectoryString] stringByAppendingPathComponent:@"PictureApp.sqlite"]];

NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"PictureApp" ofType:@"sqlite"];
if (defaultStorePath) {
    [[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}

NSError *error = nil;
[__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];
...