1

Xcode 4.3.3 の Master-Detail-Application の例を使用して、データ ビューアーを開発しました。アプリはいくつかのファイルをダウンロードしており、各ファイルをテーブルビューのセルに追加しています。すべて正常に動作します。しかし、ユーザーが再度ダウンロードを開始した場合、データベースとテーブルビューから以前のデータをすべて削除する必要があります。私は次の手順で終了しました:

  1. コーディネーターから古いストアを削除します
  2. 古い sqlite データベース ファイルを削除する
  3. デフォルトの (空の) sqlite db ファイルを bundle dir から doc dir にコピーします。
  4. アップデートストアコーディネーター
  5. テーブルビューを更新します。

しかし、問題は、そうすると、新しいデータが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!");        
4

0 に答える 0