使用Core Data、iCloud和CloudKit进行同步和备份,以及它们是如何协同工作的



我在创建一个应用程序的早期阶段,我想保存,同步和备份数据。该应用程序不会存储任何文件,只是在数据库中的数据。它将是iOS 8及以上版本,所以我可以使用CloudKit。我做了一些研究,但仍然不清楚Core Data、iCloud和CloudKit是如何协同工作的。

据我所知,CloudKit只是一种从云中获取和检索数据的方式。CloudKit只是一种与iCloud同步数据的不同方式吗?

我的问题是:

  1. 如果我使用CloudKit,我还需要创建本地核心数据库吗?

    • 如果是,它会自动与iCloud同步,或者我将不得不调用方法来存储到两个地方?
  2. 如果数据仅存储在云端,用户将能够在iOS设备未连接到互联网时访问它。我读到CloudKit将只有有限的缓存

  3. 如果iCloud帐户未启用,该如何工作?

如果有人能分解一下每种技术在离线和在线保存和同步核心数据数据库的过程中所做的工作。

我目前的理解是:

  • Core Data用于本地存储数据

  • iCloud同步数据并存储在云端

  • CloudKit提供了在云中存储和管理数据的能力??

我希望我为这个问题提供了足够的信息。

是这样的:

  • Core Data本身是完全本地的,不会自动与苹果的任何云服务一起工作。
  • Core Data with iCloud enabled打开通过iCloud同步。您保存在Core Data中的任何更改都将传播到云,并且在云中所做的任何更改都将自动下载。数据同时存储在iCloud和本地持久存储文件中,因此即使设备离线也可以使用。您不必编写任何特定于云的代码,只需添加对传入更改的侦听(这很像在不同的托管对象上下文中所做的更改)。
  • CloudKit与Core Data无关。这不是一个同步系统,这是一个传输系统。这意味着任何时候想要读/写云数据,都需要进行显式的CloudKit API调用。没有什么是自动发生的。CloudKit不将数据存储在设备上,因此如果设备处于脱机状态,则数据不可用。CloudKit还增加了一些iCloud中Core Data不具备的功能,比如公共共享数据,以及只下载部分数据集而不是整个数据集的能力。

如果你想使用CloudKit Core Data,你必须编写自己的自定义代码来在托管对象和CloudKit记录之间进行转换。这不是不可能的,但是需要编写更多的代码。可能更可靠,但现在下结论还为时过早。

我写了一篇博文,从过去使用过Core Data和iCloud的人的角度来描述CloudKit。

Update, 2016年6月:作为NSPersistentStoreCoordinator的最新文档,所有与iCloud相关的核心数据都被标记为已弃用。因此,在新的开发中应该避免使用它。

在iOS 13中,苹果宣布了Core Data的新功能,以更好地与CloudKit配合。主要增加的是NSPersistentCloudKitContainer,它基本上管理Core Data和CloudKit之间的同步。

您可以在WWDC会议中使用Core Data with CloudKit了解更多信息。

Apple还发布了一个很好的文档集,用于这种用法:使用CloudKit镜像核心数据存储