我一直在寻找正确的方法来创建由 Core-Data 支持的 .sqlite 文件的备份并将该备份存储在本地和/或 iCloud(无论用户喜欢什么)中,以供下载、恢复或分享。让我先声明一下,我不是在谈论将持久存储移动到 iCloud 以供应用程序用作其数据源。我只是在询问有关在此问题中创建备份文件的问题。
2014 年,Apple 将 Core Data SQLite 存储的默认日志模式更改为 WAL。
https://developer.apple.com/library/content/qa/qa1809/_index.html
随着这一变化,他们建议:
要安全地备份和恢复 Core Data SQLite 存储,您可以执行以下操作:使用 NSPersistentStoreCoordinator 类的以下方法,而不是文件系统 API,来备份和恢复 Core Data 存储:- (NSPersistentStore *)migratePersistentStore:( NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error
请注意,这是我们推荐的选项。
在此之前,我一直使用 NSFileManager 创建备份。有了这个建议,我相信在本地创建备份的正确方法是添加一个新的持久存储,然后分别使用 NSPersistentStoreCoordinator 方法 和 将该持久存储迁移到所需的备份addPersistentStoreWithType:configuration:URL:options:error
位置migratePersistentStore:toURL:options:withType:error
。
我的问题有两个:
- 我以前会在导出数据之前将数据压缩到 NSData,然后将 NSData 直接写入文件。我的文件扩展名将是我的应用程序自定义的,用于通过电子邮件或其他 iOS 共享方法共享压缩数据。使用该
migratePersistentStore:toURL:options:withType:error
方法,我现在在所需位置得到一个 .sqlite 文件(及其相应的 WAL 文件等),但我现在不知道如何共享此文件。如果我压缩文件,我会不会有丢失我努力保存的数据的危险migratePersistentStore:toURL:options:withType:error
?我相信是这样,但我确实想让我的用户通过电子邮件等方式共享/保存他们的备份,我现在不知道如何最好地解决这个问题。 - 我很难理解如何
migratePersistentStore:toURL:options:withType:error
将文件备份到 iCloud。就像上面的共享示例一样,我看到我可以使用addPersistentStoreWithType:configuration:URL:options:error
, 并migratePersistentStore:toURL:options:withType:error
在本地获取所需的 .sqlite 副本,但是如果我尝试将该本地文件上传到 iCloud,我担心我会丢失我努力保存的数据使用migratePersistentStore:toURL:options:withType:error
首先。我一直在尝试查看是否可以/应该使用一种方法migratePersistentStore:toURL:options:withType:error
将新创建的 persistentStore 直接移动到 iCloud,但我无法找到任何有关如何执行此操作或是否应该在全部。是否有我需要使用的特定 url 来指示persistentStore 的目的地是 iCloud?
对于这些问题的答案,我将不胜感激任何可以分享的见解。