2

Main Bundle の読み取り専用の Core Data sqlite を使用していますが、うまく機能します。データベースの新しいバージョン (より多くの読み取り専用データ) をメイン バンドルに追加すると、データベースの「古い」バージョンが読み取られます。

現在のユーザーがデータベースの新しいバージョンで更新をダウンロードするときに、新しいデータベースのバージョンを現在のバージョンにする理由と何をすべきかを理解するのに役立つ人はいますか?

これは、この投稿の問題を解決しようとする試みの一部です:ドキュメント ディレクトリから更新されたデータベースにアクセスするときの同じ問題

===解決策====

「新しい」メインバンドルの新しいデータベースの名前を変更することでこれを解決しましたが、夢のように機能します。また、これが更新の場合は、ドキュメント ディレクトリ内の古いデータベースを削除してクリーンアップします。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

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


//===READ DATABASE FROM MAIN BUNDLE===//
NSFileManager *fileManager = [NSFileManager defaultManager];

NSURL *storeUrl = [[NSBundle mainBundle] URLForResource:kNewDB withExtension:@"sqlite"];

//=== IF THE OLD DATABASE STILL EXIST DELETE IT FROM DOCUMENT DIRECTORY ===//
NSURL *oldDatabasePathURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"database.sqlite"];
NSString *oldDatabasePath = [oldDatabasePathURL path];
if ([fileManager fileExistsAtPath:oldDatabasePath]) {
    //Remove old database from Documents Directory
    [fileManager removeItemAtURL:oldDatabasePathURL error:nil];

}

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

NSError *error;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Update to handle the error appropriately.
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    exit(-1);  // Fail
}    

return persistentStoreCoordinator;
}
4

2 に答える 2

2

データベース ファイルのコピーが書き込み可能なディレクトリ (おそらく Documents ディレクトリ) に存在するかどうかを確認し、存在しない場合はそこにコピーするコード内の場所が必要です。これは、データベースに変更を加える必要がある場合に採用する非常に一般的なアプローチです。問題は、アプリを更新すると、ファイルが既に存在するため、再度コピーされることはありません。

問題を解決するには、次の 2 つの方法があります。

  1. (推奨): そもそもデータベースをコピーしないでください。読み取り専用であるため、その必要はなく、デバイスの余分なスペースを占有するだけです。メインバンドルにあるファイルのパスを使用してデータベースを開くだけです。

  2. 書き込み可能なディレクトリにファイルが存在するかどうかを確認する代わりに、メイン バンドル内のファイルよりも新しいかどうかを確認します。(日付を使用しないでください。更新プログラムが承認のためにアプリ ストアに送信された後にプログラムをインストールしてファイルを作成した可能性があるため、新しい更新プログラムがコピーされない可能性があります。バージョン情報を保存するアプリバンドルに別のファイルを保存するか、バージョン固有のコードでそれを決定することにより、データベース)。そうでない場合は、もう一度コピーしてください。

于 2012-07-15T14:10:08.697 に答える