当前位置: 首页 > 知识库问答 >
问题:

使用CoreData和CloudKit同步关系

姜运珧
2023-03-14

TLDR版本:我的应用程序如何知道设备a上的CoreData对象、设备B上的CoreData对象和CloudKit中的CKRecord都是相同的记录?

详细版本:

我正在开发一个应用程序,它在本地使用CoreData和CloudKit来实现设备间的同步。我不明白添加多个设备后,CoreData关系和CloudKit引用应该如何协同工作。

2)当您创建CloudKit记录时,您可以为它分配一个记录名(基本上是CloudKit等效于CoreData objectID)或默认情况下生成一个记录名。CloudKit引用字段包含一个字符串,该字符串是关联记录的记录名。

以下是我的应用程序的工作方式(和不工作方式)

设备A第一次发射。CoreData实例化了一组默认对象,用户可以在使用应用程序时编辑(或添加到/删除)这些对象。当安装完成并且应用程序确定一切都可以完成时,它将与CloudKit进行同步。它首先查找已存在的任何记录(没有),并使用CoreData对象作为CloudKit记录名将新记录上传到CloudKit。因此,设备A上的ObjectID和CloudKit记录名是相同的。这些不同的对象之间有多种关系。到目前为止一切都很好--这部分工作正常(仪表板中的修改正确地更新了coredata中的关系,反之亦然)。

随着设备B的首次发布,事情变得偏离了轨道。CoreData实例化相同的一组默认对象(具有唯一的对象),然后用户可以在使用应用程序时修改或添加/删除这些对象。当安装完成并且一切顺利时,它将与CloudKit进行同步。它从CloudKit中拉下所有现有记录,并更新匹配的本地记录。基于recordName<->objectIDs的匹配永远不会发生,因为设备B具有唯一的objectIDs。这就是我理解不足的地方。

我当前尝试的解决方案

我目前的解决方案是在CoreData实体和CloudKit记录中添加自定义ckID字段。在每个设备上的第一次同步时,它尝试适当地同步这些字段。如果CloudKit中有记录,它会遍历这些记录,并尝试根据自定义字段和实体类型匹配现有的CoreData对象和这些CloudKit记录,例如实体的'name'字段。当它找到匹配项时,它会在本地更新ckID字段。如果没有找到,它将创建一个新的CoreData对象。每当应用程序查找CoreData关系或创建CKReference时,都会使用此ckID字段。总的来说,这感觉我做了很多我不应该做的工作。

我仍然相信我在这里错过了一些非常基本的东西。在不同的位置,一个记录如何与其自身相关?如果可以修改现有的CoreData objectID(或在创建时分配一个),这将很容易--我错过了什么?!?我现在所做的感觉非常不对,但我正在努力前进,不知道还能尝试什么...

共有1个答案

慕和惬
2023-03-14

正如您所提到的,设备A和设备B上的objectID是不同的。如果您真的希望避免在对象中使用标识符字段,您可以在每个设备上进行查找,以便从recordName映射到objectID,但是如果您更新了核心数据模型,您的objectID将会更改,因此这种方法将非常不灵活。

您使用ckID字段的方法是正确的,是的,您实际上需要做这么多的工作。CloudKit只是一个传输层,实现同步是它自己的一个野兽。

我建议查看现有的解决方案,如集成、Seam或SyncKit(我是这些解决方案的作者)

 类似资料:
  • 我试图理解CoreData中的backgroundContext的概念。虽然我读了几篇关于它的文章,但我仍然不确定它的目的。 我有一个应用程序使用核心数据,允许用户创建,更新或删除记录。用户还可以获取他添加的数据。我想确保如果有很多记录,在获取数据时不会影响UI的流。 所以我研究了一些背景上下文。我根据自己理解的内容执行了以下操作。但我不确定这是否是一个正确的解决办法。我的想法是--如果我进入背景

  • CloudKit 提供了模型无关的,可自动版本化的 RESTful 的 JSON 存储,支持 OpenID 和 OAuth,包括 OAuth 发现。

  • 问题内容: 所以我正在用关键字测试。这是我尝试的示例: 当我运行它时,来自两个线程的调用方法的输出生成以下输出: 当我将方法更改为: 我得到以下输出: 尽管这使我清楚地了解的目的,但我想知道还有其他可以使用的原因。还是我在这里所做的,是为什么我们需要使用此关键字的唯一原因? 谢谢。 编辑: 令我感到困惑的另一件事是,在第一个输出中,为什么计数器在7之后变为3。这对我来说似乎有点不可能,但是每次尝试

  • CloudKit-Demo 是 CloudKit 的样本。通过 CloudKit-Demo 你可以轻松查看 CloudKit 的特性以及 Object-C 或 Swift 的 API。

  • 我在我的Laravel项目中与雄辩的关系作斗争。 我的数据库中有一个“用户”表和一个“用户行”表。“用户行”表中有一个“用户id”字段,该字段与“用户”中的“id”字段相对应,属于典型的主-明细关系。 用户模型与用户线模型有很多关系。UserLine模型与用户模型具有belongsTo关系。 在我的应用程序中,我有一个包含多个用户行的用户表单。在表单提交期间,可以添加、更改或删除这些用户行。到目前

  • 我的项目即将启动。在发布之后,我有一个很大的计划,数据库结构将发生变化——现有表和新表中的新列,以及与现有模型和新模型的新关联。 我还没有接触到序列化中的迁移,因为我只有测试数据,我不介意每次数据库更改时都删除这些数据。 为此,目前,如果我更改了模型定义,我会在我的应用程序启动时运行。这将删除所有表并从头开始创建它们。我可以省略选项,让它只创建新表。但如果现有的改变了,这是没有用的。 那么,一旦我