【问题标题】:Using Core Data, iCloud and CloudKit for syncing and backup and how it works together使用 Core Data、iCloud 和 CloudKit 进行同步和备份以及它们如何协同工作
【发布时间】:2014-08-17 23:29:04
【问题描述】:

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

据了解,CloudKit 只是一种从云端获取和检索数据的方式。 CloudKit 只是与 iCloud 同步数据的另一种方式吗?

我的问题是:

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

    • 如果是,它会自动与 iCloud 同步,还是我必须调用方法来存储到这两个地方?
  2. 如果数据仅存储在云中,则用户可以在 iOS 设备未连接到 Internet 时访问它。我读到 CloudKit 只有有限的缓存。

  3. 如果未启用 iCloud 帐户,它将如何工作。

如果有人可以分解每种技术在离线和在线保存和同步核心数据数据库的过程中的作用。

我目前的理解是:

  • Core Data用于本地存储数据

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

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

我希望我为这个问题提供了足够的信息,以免被关闭。

【问题讨论】:

  • 即使我没有对它进行太多研究,但据我所知,它不会存储在本地。它类似于普通的服务器客户端服务。这就是为什么没有互联网就无法访问数据库的原因。并且根据文档,如果用户当时没有启用 icloud 帐户,您只能从公共容器中读取数据
  • @Yan 我们可以这样做吗请建议,stackoverflow.com/questions/25600556/…

标签: ios core-data icloud cloudkit


【解决方案1】:

是这样的:

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

如果您想将 CloudKit 与 Core Data 一起使用,您必须编写自己的自定义代码来在托管对象和 CloudKit 记录之间进行转换。这并非不可能,但需要编写更多代码。它可能更可靠,但现在断言还为时过早。

我写了a blog post,从过去使用过 Core Data 和 iCloud 的人的角度描述了 CloudKit。

更新,2016 年 6 月:截至 the most recent documentation for NSPersistentStoreCoordinator,与使用 iCloud 的 Core Data 相关的所有内容都被标记为已弃用。因此,在新的开发中应该避免使用它。

【讨论】:

  • 过去我在 iCloud 中使用 Core Data 时遇到过损坏问题,但自从 iOS 7 发布以来我并没有使用太多。应该会好很多对于 CloudKit,现在说还为时过早,因为它还没有正式发布。
  • @Tom Harrington - 您能否在 iOS 8 上尝试使用 iCloud 的 Core Data 并告诉我们您的印象?我在 iOS 7 中也经历了很多损坏,Apple 支持确认了许多错误。我希望 iOS 8 将其可靠性提高到可以接受的水平,但很想听听专家的意见 ;)
  • 查看 CKSIncrementalStore。 github.com/CloudKitSpace/CKSIncrementalStore
  • “您不必编写任何特定于云的代码,您只需添加对传入更改的侦听(这很像在不同的托管对象上下文上所做的更改)。” -- 你有关于这个评论的代码示例/示例吗?我找不到可靠的例子:(
  • @TomHarrington 有这样的反馈,如果我们需要做的只是检查文档,为什么还要使用 stackoverflow :(
【解决方案2】:

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

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

Apple 还针对这种用法发布了一系列不错的文档:Mirroring a Core Data store with CloudKit

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 2014-08-31
    • 2021-07-19
    • 2015-11-08
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多