2013-11-14 13 views
6

以前は、プリロードされたデータベースを使用してアプリケーションをリリースしました。そのため、ユーザーは最初の実行時にアプリケーションを更新する必要はありませんでした。私は(申し訳ありませんが、もうリンクを持っていない)私は私のアプリデリゲートのpersistentStoreCoordinatorメソッドに追加するように別の質問で見つかったいくつかのコードがありました:iOS 7でデータベースをあらかじめロードする

- (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でこれを実行しようと、Iエラーは発生しませんが、データベースは空です(私のmainBundleのデータベースには私が期待しているすべての情報が含まれていますが)。 applicationDocumentsDirectoryにデータベースファイル(.sqlite-shmファイルと.sqlite-walファイル)がさらに存在することに気付きました。これらのファイルで何かする必要がありますか?それとも、アプリケーションにプリロードされたデータベースを持ち込むことができなくなっていますか?

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

答えて

5

コアデータは、主にセーブがどのように実行されるか、iOS 7では少し変わっています。

パフォーマンスを向上させるためにログ前書き(wal)が導入されました。したがって、表示されるWAL sqliteファイルです。

あなたが古い「ジャーナルモード」を使用するアプリケーションを伝えることができます:設定:URL:あなたは addPersistentStoreWithTypeを呼び出すときのオプションにNSSQLitePragmasOption を追加することにより、ジャーナル・モードを指定することができます

をオプション:エラー。例えば。私は、これはあなたの問題を解決するかどうかわからないが、それはiOSの7のコアデータに変更されている大きなものである

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

Source

: にDELETEの前のデフォルトのモードを設定します

あなたはWALについてもっと学びたいのであれば、私はそれはwは私も.sqlite-SHMと.sqlite-WALファイルをコピーしWWDC session #207, "Whats New In Core Data & iCloud"

+0

うん、 'options'辞書はトリックを行うと付け加えました。あなたがリンクしたビデオをチェックしてみると、それは私が必要とするものではないと思う=)。そうでなければ、別の解決策を見つけなければならないだろうが、これは今のところうまくいくようだ。 – GeneralMike

+0

WALはマルチスレッドアプリケーションでパフォーマンスが向上するため、ジャーナルモードの変更には注意が必要です。私は、WALを有効にして事前入力済みのデータベースを出荷する方法を正確にはわかりません。 –

+0

@DavidCaunt:私はこの時点で私のアプリのパフォーマンスについてあまり心配していません。以前のバージョンのアプリケーションではデータベース操作がかなり遅かったですが、多くのテーブルを大幅に削減して無駄なスペースを無くし、フェッチを変更してセッションで必要となる情報をよりうまく得るようにしました。これらの変更の後、検出可能な遅延は事実上ありません。何かが変わってパフォーマンスが再び苦しみ始めると、WALをもう一度見ていくことに気をつけます - ありがとう。 – GeneralMike

5

を見てお勧めorked:

(に基づいて: Core Data Store included in App Bundle
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *storePath = [documentsDirectory stringByAppendingPathComponent: @"emm_samples.sqlite"]; 

// Check if the sqlite store exists 
if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) { 
    NSLog(@"File not found... copy from bundle"); 

    // copy the sqlite files to the store location. 
    NSString *bundleStore = [[NSBundle mainBundle] pathForResource:@"emm_samples" ofType:@"sqlite"]; 
    [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:nil]; 

    bundleStore = [[NSBundle mainBundle] pathForResource:@"emm_samples" ofType:@"sqlite-wal"]; 
    storePath = [documentsDirectory stringByAppendingPathComponent: @"emm_samples.sqlite-wal"]; 
    [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:nil]; 

    bundleStore = [[NSBundle mainBundle] pathForResource:@"emm_samples" ofType:@"sqlite-shm"]; 
    storePath = [documentsDirectory stringByAppendingPathComponent: @"emm_samples.sqlite-shm"]; 
    [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:nil]; 
} 
else { 
    NSLog(@"File exists"); 
} 

関連する問題