6

過去に、プリロードされたデータベースを使用してアプリをリリースしたので、ユーザーは最初の実行時にデータベースを更新する必要がありませんでした。SOに関する別の質問で見つけたコードがいくつかありました(申し訳ありませんが、リンクはもうありません)。それをApp DelegateのpersistentStoreCoordinatorメソッドに追加しました:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"db.sqlite"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]])
    {
        NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite"]];
        NSError* err = nil;

        if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err])
        {
            NSLog (@"Error - Could not preload database.");
        }
    }

//... more code generated from the template here
}

iOS 7 でこれを実行しようとすると、エラーは発生しませんが、データベースは空です (私のデータベースにmainBundleは期待している情報がすべて含まれています)。にさらにデータベース ファイル (.sqlite-shm ファイルと .sqlite-wal ファイル) があることに気付きましたapplicationDocumentsDirectory。それらのファイルでも何かをする必要がありますか? それとも、プリロードされたデータベースをアプリに同梱することはできなくなりましたか?

編集:新しい .sqlite-shm および .sqlite-wal ファイルもコピーするコードを追加しようとしましたが、それは役に立ちません。

4

2 に答える 2

5

Core Data は iOS 7 で少し変更され、主に保存方法が変更されました。

Write Ahead Logging (wal) はパフォーマンスを改善するために導入されたため、WAL sqlite ファイルが表示されます。

古い「ジャーナル モード」を使用するようにアプリに指示できます。

addPersistentStoreWithType:configuration:url:options:error を呼び出すときにオプションに NSSQLitePragmasOption を追加することで、ジャーナル モードを指定できます。たとえば、DELETE の以前のデフォルト モードを設定するには:

NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} };

ソース

これで問題が解決するかどうかはわかりませんが、iOS 7 の Core Data で変更された大きなことです。

WAL について詳しく知りたい場合は、WWDC セッション #207「Whats New In Core Data & iCloud」をご覧になることをお勧めします。

于 2013-11-14T16:21:20.660 に答える