Что не так с persistentStoreCoordinator?
Может кто-нибудь сказать мне, что не так с кодом ниже? Он всегда вылетает в строке, содержащей "addPersistentStoreWithType".
Любое предложение будет приветствоваться.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
// The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
// Create the coordinator and store
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Core_Data.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:[storeURL path]]) {
NSURL *defaultStoreURL=[[NSBundle mainBundle] URLForResource:@"Core_Data" withExtension:@"sqlite"];
if (defaultStoreURL) {
// By default we use what is in the bundle read-only.
storeURL=defaultStoreURL;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![fileManager fileExistsAtPath:[storeURL path]])
NSLog(@"RO-DB NOT FOUND");
else NSLog(@"RO-DB FOUND");
NSError *error = nil;
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:@{NSSQLitePragmasOption:@{ @"journal_mode":@"DELETE" },
NSReadOnlyPersistentStoreOption:[NSNumber numberWithBool:YES]}
error:&error]) {
NSLog(@"RO-DB NOT OPENED");
}
return _persistentStoreCoordinator;
}
}
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
Остальная часть кода - не что иное, как то, что генерируется Xcode при создании нового проекта с использованием шаблона Single View с Core Data.
2 ответа
Вы не можете добавить хранилище для чтения и записи, которое находится в комплекте. Пакет только для чтения.
Вместо этого сначала скопируйте файл sqlite в каталог документов и используйте этот URL-адрес, чтобы добавить хранилище в координатор хранилища.
Я не думаю, что journal_mode "удалить" и NSReadOnlyPersistentStoreOption
совместимы. (Похоже, в любом случае это не имеет никакого смысла.) Возможно, параметр journal_mode "off" или нет параметр journal_mode был бы более перспективным.
Вот что я делал неправильно: я не копировал все необходимые файлы в комплект. Я пробовал с одним или двумя, но есть три: File.sqlite, File.sqlite-shm, File.sqlite-wal.
Надеюсь, что это может помочь кому-то еще в будущем.
Кто-то с более глубоким пониманием основных данных может пожелать прокомментировать дальше.