1

アプリで Core Data を使用していましたが、突然次のようなエラー メッセージが表示されました。

パス file://localhost/var/mobile/Applications/xxx-xxx-xxx../.app/MyModel.sqlite read/write に読み取り専用ファイルを追加しようとしました。代わりに読み取り専用を追加します。これは、将来的には重大なエラーになります。NSReadOnlyPersistentStoreOption を指定する必要があります。

以下のメソッドでエラーが発生しました。

-(NSPersistentStoreCoordinator*)persistentStoreCoordinator{

    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSString* path= [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"MyModel.sqlite"];
    NSURL* storeURL = [[NSURL alloc] initFileURLWithPath:path];

    NSError* error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

   if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    return _persistentStoreCoordinator;
}

今日まで、このエラー メッセージを見たことがありませんでした。誰が何がうまくいかなかったのか教えてもらえますか? お時間をいただきありがとうございます。

4

2 に答える 2

0

アプリで読み取り専用データベースを出荷しようとしているためにここにたどり着いた人のために、ストアを作成するコードを次に示します。

NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @(true),
                          NSInferMappingModelAutomaticallyOption: @(true),
                          NSReadOnlyPersistentStoreOption: @(true))

// The NSReadOnlyPersistentStoreOption is the important one here

NSPersistentStore * seedStore =[coordinator
                                addPersistentStoreWithType:NSSQLiteStoreType
                                configuration:@"Seed"
                                URL:[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Seed" ofType:@".sqlite"]]
                                options:options
                                error:&error];

また、データベースを作成するときに、おそらくジャーナル モードを WAL に設定しますが、これは読み取り専用のデータベースとは互換性がありません。次の 2 つの選択肢があります。

  1. オプションに NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}} を追加します
  2. または、 Liyaなどのツールを使用してシード データベースを開き、「PRAGMA wal_checkpoint(RESTART)」に続いて「PRAGMA journal_mode = DELETE」を実行します。
于 2014-12-04T14:51:37.793 に答える