アプリケーションと完全に連携する CoreData データベースがあります。データベースには、ユーザーが保存したプリセットが保存されます。ユーザーが iTunes 経由のファイル共有を使用してデータベースをバックアップできるようにしたいと考えています。
基本的に私はしたい:
バックアップ: データベース -> ユーザーがデバイス間で転送できるファイル
復元: ファイル -> データベース
私が考えた最も簡単な方法は、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];
}];
}
私はそれを機能させていますが、それが安全で好ましい解決策であるかどうかはわかりません(コアデータの新機能)。入力はありますか?