如何在 Core Data/Cloud Kit App 中找到并删除正在创建 CDMR 同步请求的内容?

Posted

技术标签:

【中文标题】如何在 Core Data/Cloud Kit App 中找到并删除正在创建 CDMR 同步请求的内容?【英文标题】:How can I find and remove what is creating CDMR sync request in Core Data/Cloud Kit App? 【发布时间】:2020-12-16 17:47:14 【问题描述】:

我的应用同时使用 Core Data 和 CloudKit。我一直收到这样的调试消息:

020-12-16 11:05:48.933716-0600 Prayer Sparks[13035:4347318] [error] error: CoreData+CloudKit: 
-[PFCloudKitCKQueryBackedImportWorkItem queryOperationFinishedWithCursor:error:completion:](105):
 <PFCloudKitCKQueryBackedImportWorkItem: 0x2829375c0 - 
<NSCloudKitMirroringImportRequest: 0x281697ea0> 
ACD62C39-CCBB-4FDE-BBBE-337C9725E759>  CDMR:nil : 
Failed due to querying for an unknown record type (not fatal, 
schema needs to be initialized): <CKError 0x28165c420: 
"Unknown Item" (11/2003); server message = "
  "recordTypeId" : "CDMR",
  "title" : "did not find record type"
"; uuid = EAF05A49-2FB4-460B-A93D-DBFD9FF1E755; container ID = "iCloud.com.stevenhovater.Prayer-Sparks">

即使是最低的调试反馈级别,大约每 5-15 秒就会出现一个版本的调试消息。我的解释是,在后台,应用程序正在排队向公共数据库发出请求以查询 CDMR 记录(云套件在 Core Data 中近似关系的方式,根据此处的文章:https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/reading_cloudkit_records_for_core_data)

但是,我的应用在模型中没有任何关系。 它在某一时刻确实如此,但我早就删除了那些。我的怀疑是,模型在某个地方生成了一些东西来管理后台的关系,并且它作为工件在某处徘徊。自从这种关系存在以来,我可能已经清理和重建了一百次,并且还多次删除了应用程序的“派生数据”文件夹。我已经在 CloudKit 仪表板中重置了架构并使用虚拟数据重新初始化了几次,但此消息仍然存在。

罪魁祸首隐藏的任何想法,以及如何摆脱它?

【问题讨论】:

您是否在 CloudKit 仪表板中进行了“重置环境”(它位于齿轮菜单下)?或者,也许您还有其他设备或模拟器,其中仍然有旧数据? 我确实重置了开发环境(反复!),并删除了模拟器预览,但无济于事。删除了我所有设备上的应用程序和数据!它仍然出现。还尝试创建另一个模型版本,但这也没有帮助。 【参考方案1】:

这里有同样的问题。消息已经出现了一段时间(只要我能忍受就被忽略!)所以我无法准确确定消息何时开始出现,但我最好的猜测是它们开始于我将模型移动到的时间将私人记录与公共记录合并/合并 - NSManagedObject 和 CKRecords 处理关系的方式可能有所不同?

无论如何 - @Reinhard Männer 在 CloudKit 仪表板中创建空 CMDR 记录并将 createdTimestamp、modifiedTimestamp 和 recordName 的索引设置为可查询的解决方案对我有用。

我确实尝试在我的数据模型中创建虚拟相关实体,但它解决了任何问题,我怀疑是因为在我的情况下它们没有被初始化/推送到 CloudKit,所以服务器对它们一无所知。

相反,我放弃了所有这些,清理了所有内容,只是在 CloudKit 仪表板中手动将空 CMDR 记录添加到我的架构中,将索引设置为可查询,瞧!成功了 - 最后,完成了 2 分钟的工作。

【讨论】:

【参考方案2】:

我遇到了完全相同的问题。我什至启动了一个新的 CloudKit 容器,看看这是否会消除控制台中的错误。但它坚持了下来。就像你在模型中没有关系一样。

这是我的控制台输出:

2021-02-02 16:41:23.046546-0800 TheList[3209:705968] [错误] 错误: CoreData+CloudKit:-PFCloudKitCKQueryBackedImportWorkItem queryOperationFinishedWithCursor:error:completion:: 473727C1-9A49-4CE0-A1A3-6971EA1D48AB> CDMR:nil :由于以下原因而失败 查询未知的记录类型(不是致命的,模式需要是 已初始化):

【讨论】:

如果您有类似的问题或想添加一些内容,请添加为评论。 @qed007,欢迎您!您已发布评论作为答案。由于您是 *** 的新手,您可能还没有添加 cmets 的权限。【参考方案3】:

我想我找到了解决方案,或者至少找到了解决方法。在我看来, NSPersistentCloudKitContainer 期望 在模型中的某个地方具有 M:N 关系。为了解决这个问题,我刚刚创建了两个空实体并为它们分配了相互连接。现在 CloudKit 仪表板包含 CDMDR 记录类型,并且错误消息消失了。这可以通过手动创建具有相同属性的 CDMR 记录来解决(见屏幕截图),但我还没有尝试过。

【讨论】:

【参考方案4】:

添加到@skahlert 的答案,我添加了一对实体和连接它们的 M:M 关系,用它们初始化架构,并观察到一个 CDMR 记录类型出现在仪表板中。然后,我从我的模型中删除了这对实体,并再次初始化架构以查看 CDMR 记录类型是否已删除......它没有。

如果 Apple 在初始化公共数据库时自动实例化 CDMR,那将会很方便。与此同时,我们似乎只是添加了一个必要的部分来访问公共数据库,否则对单个应用程序的功能没有影响。

【讨论】:

【参考方案5】:

我的核心数据模型中有一个 m:m 关系,以及 iCloud 上的相应 CDMR 记录。 然后我更改了模型,使其不再有关系,并且一切正常。 然后我删除了 iCloud 仪表板中显然不再需要的 CDMR 记录。 之后,我的核心数据 iCloud 镜像不再适用于日志

<NSCloudKitMirroringImportRequest: 0x7b0c00099f60> 66A4A241-9DF2-4B4E-B50F-57E3C59BA12D>  CDMR:nil : Failed due to querying for an unknown record type (not fatal, schema needs to be initialized): <CKError 0x7b0c0009c1b0: "Unknown Item" (11/2003); server message = "Did not find record type: CDMR"; 

初始化架构没有帮助。我还尝试再次添加 m:m 关系,但没有创建 CDMR 记录。

接下来,我在仪表板中创建了一条空的 CDMR 记录,并为 createdBy、modTime 和 recordID 添加了可查询索引,镜像再次起作用。

最终,我删除了 m:m 关系,应用程序继续运行。

看来,唯一的要求是任何(甚至是空的)具有必要索引的 CDMR 记录都存在

【讨论】:

以上是关于如何在 Core Data/Cloud Kit App 中找到并删除正在创建 CDMR 同步请求的内容?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 http-kit 和 core.async 制作一个完全非阻塞的后端应用程序吗?

HMS Core热门Kit Top问题合集,你要问的,这里全都有!

HMS Core 6.0全球上线Network Kit全链路网络加速技术,应用无惧网络拥塞

HMS Core 6.0全球上线Network Kit全链路网络加速技术,应用无惧网络拥塞

SAP Commerce Cloud 新一代 UI Spartacus 和 Customer Data cloud 的集成

iOS Fabric Crashlytics Answers Kit不收集数据