gpt4 book ai didi

core-data - 核心数据: inverse relationship for two relationships with same type

转载 作者:行者123 更新时间:2023-12-02 22:16:17 25 4
gpt4 key购买 nike

在我的应用程序核心数据模型中,我有工作表和文本实体。工作表实体可以有两个文本:privacyNotes 和 termsOfUse。

都是文本类型。因此,在 XCode 数据建模器中,我在带有文本目标的工作表中创建名为“privacyNotes”和“termsOfUse”的一对一关系。接下来进入文本中的一对一关系“表”。然后我选择 Text.sheet 关系作为 Sheet.privacyNotes 的逆关系。到目前为止,一切都很好。但是,当我将相同的 Text.sheet 关系设置为 Sheet.termOfUse 的逆关系时,XCode 会将此关系删除为逆 Sheet.privacyNotes!

我知道数据库中的关系与 Objective-C 对象关系相比并不那么简单,但我真的不明白为什么 SQLite 或 (CoreData) 不能重用一种关系作为少数其他关系的逆关系?

最佳答案

稍微了解一下抽象概念可能会有所启发*:一个关系只能是另一个关系的逆关系,因为在后备存储中,它们由相同的数据表示。如果文本和工作表可以具有某种关系,则核心数据会执行优秀的人类数据建模人员会执行的操作,并尽可能简洁地存储该关系。实体对象的关系属性只是查看该关系的方法。

要获得您想要的效果:请继续并为“privacyNote”和“termsOfUse”提供工作表属性;但给出诸如sheetIAmTermsFor和sheetIAmPrivacyNoteFor之类的文本属性,并将它们适本地设置为相反的。然后在 Text 类中,添加一个合成属性,如下所示:

// in interface
@property (nonatomic, readonly) Sheet *sheet;
// in impl
-(Sheet *)sheet
{
if ([self sheetIAmTermsFor])
return [self sheetIAmTermsFor];
else
return [self sheetIAmPrivacyNoteFor];
}

如果您也想编写一个setter,您必须决定该setter应该赋予文本哪个角色(核心数据无法为您计算出哪个角色,这是属性不能与两个不同的属性。)

如果您需要强制规定文本只能是“privacyNote”或“terms”,但不能同时是两者,请覆盖sheetIAmTermsFor和sheetIAmPrivacyNoteFor的setter,遵循Apple在文档,并在设置时将另一个属性设置为 null。

(* Apple 将 Core Data 生成的 SQLite 数据库视为其实现的私有(private)数据库,但检查其架构非常有教育意义。只是不要试图编写在 CD 后面直接访问数据库的交付代码。 )

关于core-data - 核心数据: inverse relationship for two relationships with same type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4985075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com