Xcode 4.3.3 の Master-Detail-Application の例を使用して、データ ビューアーを開発しました。アプリはいくつかのファイルをダウンロードしており、各ファイルをテーブルビューのセルに追加しています。すべて正常に動作します。しかし、ユーザーが再度ダウンロードを開始した場合、データベースとテーブルビューから以前のデータをすべて削除する必要があります。私は次の手順で終了しました:
- コーディネーターから古いストアを削除します
- 古い sqlite データベース ファイルを削除する
- デフォルトの (空の) sqlite db ファイルを bundle dir から doc dir にコピーします。
- アップデートストアコーディネーター
- テーブルビューを更新します。
しかし、問題は、そうすると、新しいデータがsqliteファイルに書き込まれないことです。誰かが私のコードをチェックしてください。次のコードは、MasterViewController.m にあります。私は数日以来これに取り組んでおり、私は完全に立ち往生しています!!!
ありがとうございました!
NSLog(@"Delete existing database file and copy default from bundle dir!");
NSFileManager* fileManager = [[NSFileManager alloc] init];
fileManager = [[NSFileManager alloc] init];
NSError *error = nil;
//get the documents directory:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
// create database path documents dir
NSString *databasepath = [documentsDirectory stringByAppendingPathComponent:@"MyDatabase.sqlite"];
NSLog(@"Destination Database Path = %@", databasepath);
// create database path bundle dir
NSString *resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"MyDatabase.sqlite"];
NSLog(@"Recource Database Path = %@", resourceDBFolderPath);
// remove old store from coordinator
error = nil;
NSManagedObjectModel *managedObjectModel;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyDatabase" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]];
NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"MyDatabase.sqlite"];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
if (error != nil){
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
NSPersistentStore *persistentStore = [[persistentStoreCoordinator persistentStores] objectAtIndex:0];
[persistentStoreCoordinator removePersistentStore:persistentStore error:&error];
if (error)
if (error != nil){
NSLog(@"error removing persistent store %@ %@", error, [error userInfo]);
}
// Remove old database file
[[NSFileManager defaultManager] removeItemAtPath: [documentsDirectory stringByAppendingPathComponent: @"MyDatabase.sqlite"] error: &error];
if (error != nil){
NSLog(@"delete Database status: %@", [error localizedDescription]);
}
// copy default empty database file into documents dir
[fileManager copyItemAtPath: resourceDBFolderPath toPath: databasepath
error: &error];
if (error != nil){
NSLog(@"copy default Database status: %@", [error localizedDescription]);
}
// then update storecoordinator
// add clean store file back by adding a new persistent store with the same store URL
if (![persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType
configuration: nil
URL: storeURL
options: nil
error: &error]) {
NSLog(@"failed to add db file, error %@, %@", error, [error userInfo]);
}
NSLog(@"Database replacement end!");