我的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];
}];
}
我有它工作,但是,我不确定它是否是一个安全和首选的解决方案(核心数据的新手)。有什么输入吗?
答案 0 :(得分:0)
如果你的用法很简单,那一般应该没问题。
如果您使用外部链接来处理大型二进制数据,则还需要复制这些文件。
如果使用文件包(或UIManagedDocument),则需要整个文件包,而不仅仅是sql存储。
如果您使用的是iCloud,还有其他一些需要担心的事情......