3

アプリケーションと完全に連携する CoreData データベースがあります。データベースには、ユーザーが保存したプリセットが保存されます。ユーザーが iTunes 経由のファイル共有を使用してデータベースをバックアップできるようにしたいと考えています。

基本的に私はしたい:

  1. バックアップ: データベース -> ユーザーがデバイス間で転送できるファイル

  2. 復元: ファイル -> データベース

私が考えた最も簡単な方法は、persistentStore を単純にコピーして置き換えることでした。そのようです..

これは私がデータベースを作成する方法です:

self.database = [[UIManagedDocument alloc] databaseURL]; 
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.database.fileURL path]]) {
    [self.database saveToURL:self.database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { }]; 

}

これは、persistentStore を置き換える方法です。

- (void)restoreBackupWithBackupURL:(NSURL *)backupURL {
// close the current document
[self.database closeWithCompletionHandler:^(BOOL success) {        
    // GET PERSISTENT STORE URL
    NSURL *databaseURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    databaseURL = [databaseURL URLByAppendingPathComponent:@"Default Database"];
    databaseURL = [databaseURL URLByAppendingPathComponent:@"StoreContent"];
    databaseURL = [databaseURL URLByAppendingPathComponent:@"persistentStore"];

    // DELETE PERSISTENT STORE
    NSError *error;
    BOOL deleted  = [[NSFileManager defaultManager] removeItemAtURL:databaseURL error:&error];
    if (!deleted) {
        NSLog(@"Error deleting file: %@", error.localizedDescription);
        return;
    }

    // COPY BACKUP PERSISTENT STORE
    BOOL copied = [[NSFileManager defaultManager] copyItemAtURL:backupURL toURL:databaseURL error:&error];
    if (!copied) {
        NSLog(@"Error copying file: %@", error.localizedDescription);
        return;
    }

    // INITIALIZE
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"Default Database"];

    self.database = [[UIManagedDocument alloc] initWithFileURL:url]; 
}];    

}

私はそれを機能させていますが、それが安全で好ましい解決策であるかどうかはわかりません(コアデータの新機能)。入力はありますか?

4

1 に答える 1

0

使い方が簡単であれば、一般的には問題ありません。

大きなバイナリデータに外部リンクを使用する場合は、それらのファイルもコピーする必要があります。

ファイルパッケージ(またはUIManagedDocument)を使用する場合は、SQLストアだけでなく、ファイルパッケージ全体を使用する必要があります。

iCloudを使用している場合は、他にも心配することがあります...

于 2012-08-03T18:51:26.657 に答える