Что не так с 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.

Надеюсь, что это может помочь кому-то еще в будущем.

Кто-то с более глубоким пониманием основных данных может пожелать прокомментировать дальше.

Другие вопросы по тегам