【问题标题】:Is it safe to replace a CoreData persistantStore with NSFileManager?用 NSFileManager 替换 CoreData persistantStore 是否安全?
【发布时间】:2012-08-01 10:08:05
【问题描述】:

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

}

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

【问题讨论】:

    标签: ios ipad core-data nsfilemanager uimanageddocument


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复。无法通过iTunes文件共享将文件包传输到应用程序中,因此我无法复制整个目录。我目前仅复制和替换persistentStore(将其放回现有文件包(默认数据库/StoreContent)中的正确位置,它似乎工作正常。你认为这可以吗?如果不是,我确实需要复制整个文件包,为什么会这样?
    猜你喜欢
    • 2019-07-24
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多