Persistentstorecoordinator sqlite код ошибки: 522 'не ошибка'
Я работаю над проектом iOS, который занимается миграцией, используя разные версии моих исходных кодов.
Я также попытался окружить оператор if в catch, и он возвращает код ошибки 522 sqlite.
Здесь что-то не так?
мой следующий код:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{
if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory]
URLByAppendingPathComponent:@"coredatadb.sqlite"];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]){
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
[__persistentStoreCoordinator release];
__persistentStoreCoordinator = nil;
return [self persistentStoreCoordinator];
}
return __persistentStoreCoordinator;
Ответы
Ответ 1
Итак, похоже, что следующее решение моей конкретной проблемы, хотя некоторые люди будут советовать не изменять режим ведения журнала в вашей базе данных sqlite:
// Change journal mode from WAL to MEMORY
NSDictionary *pragmaOptions = [NSDictionary dictionaryWithObject:@"MEMORY" forKey:@"journal_mode"];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
pragmaOptions, NSSQLitePragmasOption, nil];
Ответ 2
Изменяя режим ведения журнала, вы избегаете этой проблемы, но не исправляете ее. Новый режим ведения журнала предоставляет вашему приложению некоторые преимущества, такие как скорость.
Реальная проблема заключается в том, что вы удаляете только один файл, а не все 3, которые используются в этом режиме. Там не только ваш coredatadb.sqlite, но также файл coredatadb.sqlite-shm и coredatadb.sqlite-wal. Что-то о схеме и переписывании или так, проверьте видео WWDC 2013 по основным данным для деталей.
Чтобы устранить проблему, вы должны удалить все файлы в каталоге "Документы", начинающиеся с "coredatadb.sqlite", и все снова и снова, -)
Обновление для iOS 9: теперь проще и безопаснее использовать destroyPersistentStoreAtURL или replacePersistentStoreAtURL. См. Сессию WWDC 2015 220_hd_whats_new_in_core_data.