用NSFileManager替换Core Data持久存储是否安全?

时间:2012-08-03 10:57:03

标签: ios ipad core-data nsfilemanager uimanageddocument

我的CoreData数据库与我的应用程序完美配合。数据库存储由用户保存的预设。我想让用户能够通过iTunes使用文件共享备份数据库。

基本上我想:

  1. 备份:数据库 - >文件用户可以在设备之间传输

  2. 还原:文件 - >数据库

  3. 我想到的最直接的方法是简单地复制和替换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]; 
    }];    
    

    }

    我有它工作,但是,我不确定它是否是一个安全和首选的解决方案(核心数据的新手)。有什么输入吗?

1 个答案:

答案 0 :(得分:0)

如果你的用法很简单,那一般应该没问题。

如果您使用外部链接来处理大型二进制数据,则还需要复制这些文件。

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

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