我有一个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];
    }];
    

    }

    我可以使用它,但是,我不确定它是否是安全且首选的解决方案(对于核心数据来说是新的)。有输入吗?

    最佳答案

    如果您的用法足够简单,那通常应该可以。

    如果将外部链接用于大型二进制数据,则还需要复制这些文件。

    如果使用文件包(或UIManagedDocument),则需要整个文件包,而不仅仅是sql存储。

    如果您使用的是iCloud,则还有其他一些事情要担心...

    关于ios - 用NSFileManager替换Core Data持久存储是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11794368/

    10-14 22:16
    查看更多