如何解决与 SwiftData / CloudKit 的关系问题?

问题描述 投票:0回答:1

我在我的应用程序中设置了以下模型,它使用

SwiftData
Cloudkit
。一个
Project
对象有一个
Book
对象数组。一个
Book
对象有一个
Reader
对象数组。一个
Reader
对象有一个
Comment
对象数组。
Comment
对象具有对
Book
对象的引用:

class Project
{
    @Relationship(deleteRule: .cascade, inverse: \Book.project) var books : [Book]?
    
    ...
}

class Book
{
    @Relationship(deleteRule: .nullify, inverse: \Reader.books) var readers : [Reader]?
    
    var project: Project?
    var comments: [Comment]?
    
    ...
}

class Reader
{
    @Relationship(deleteRule: .cascade, inverse: \Comment.reader) var comments: [Comment]?
    
    var book: [Book]?
    
    ...
}

class Comment
{
    @Relationship(deleteRule: .nullify, inverse: \Book.comments) var book: Book?

    var reader: Reader?
    
    ...
}

另一个注意事项是

Project
Reader
都是根模型对象(相同的
Reader
可以出现在不同的项目中)。这就是为什么
Book
类的
readers
属性
deleteRule
设置为
.nullify
而不是
.cascade

我对

Project
Book
Reader
没有任何问题,我能够使用这些类中的数据输出列表,并且当我添加/删除项目时可以看到
CloudKit
在多个设备上更新它们。但是,当
CloudKit
类包含上面的两个关系属性(
Comment
book?
)时,
reader?
停止工作。当我删除这两个属性时,
CloudKit
再次正常工作。 (注意:我还从项目中删除了引用
Comment
类的任何其他代码,因此我知道正是这两行代码导致了问题。)当它们在那里时,我得到一个日志中出现一堆此类错误:

错误:CoreData+CloudKit:-NSCloudKitMirroringDelegate _requestAbortedNotInitialized:: - 从未成功初始化且无法执行 请求' 7A3F34C3-4492-4B2C-B6D9-A0D00FCEE498' 由于错误:错误 Domain=NSCocoaErrorDomain Code=134421“导入失败,因为应用 累积的更改遇到了未处理的异常。” UserInfo={NSLocalizedFailureReason=导入失败,因为应用了 累积的更改遇到了未处理的异常。, NSUnderlyingException=-[__NSDictionaryM UTF8String]:无法识别 选择器发送到实例 0x600000d76560}

我的模型是否存在导致此问题的缺陷?与

Comment
Reader
的关系看起来很简单,这与我在
Project
Book
Book
Reader
之间使用的关系类型相同。
Comment
Book
的关系有点不同,我为每个
Book
定义一个
Comment
(然后需要在
Comments
类中包含一组
Book
以满足关系要求)。这样做的原因是因为一个
Reader
可以在不同的
Comments
Books
上有许多不同的
Projects
,并且需要一种方法来过滤它们。

我对这里发生的事情感到困惑,觉得这是由于对

CloudKit
/
SwiftData
关系缺乏更深入的了解,但我无法找到有关此问题的许多资源。任何帮助将不胜感激。

swift relationship cloudkit swiftdata
1个回答
0
投票

当我将

Comment
类重命名为
CommentX
时,一切都按预期进行。所以实际上这个问题与代码本身无关,但我猜
CloudKit
数据库有问题,可能是由于
Comment
类的旧版本有问题。当我进入
CloudKit
控制台并重置侧面板上的环境时,我能够再次命名我的类
Comment

© www.soinside.com 2019 - 2024. All rights reserved.