Xcode Core Data 替代关系而不是通用类型的逆向关系

Posted

技术标签:

【中文标题】Xcode Core Data 替代关系而不是通用类型的逆向关系【英文标题】:Xcode Core Data alternative to relationships without inverse for general-purpose types 【发布时间】:2014-10-29 04:00:51 【问题描述】:

我正在努力成为一名“优秀的小程序员”,并为我的核心数据模型中的所有关系实现逆运算。但是,我遇到了一种情况,使这看起来不切实际。

为简单起见,考虑一个名为 Location 的通用实体类型,它包含一个 x 属性和一个 y 属性(并且可能包含其他属性,但让我们保持简单)。几种不同的实体类型可能需要跟上一个或多个位置(玩家有一个原始位置和一个当前位置,单元格有位置,目的地有位置等)。鉴于这种通用类型的所有不同用途,在位置实体类型中为它在其他实体中使用的每个实例建立反向关系似乎是不切实际的。

Core Data 中是否有更好的替代方法来实现非常通用的实体类型,从而避免需要没有逆关系的关系?

【问题讨论】:

我目前正在开发一个应用程序,该应用程序利用 Core Data 和一个没有逆实体的实体。我也对此感到担忧,并发现以下 SO 帖子很有帮助:***.com/questions/764125/… Apple 的“单向关系”下的核心数据编程指南指出“并非严格需要对双向关系进行建模。”我之前没有成功找到替代方案,但我的应用程序中的单向关系也没有任何问题。希望这会有所帮助。 感谢您的评论。我猜我要么必须处理单向关系,要么在每次使用我的通用实体类型时强制建立反向关系。我可以使位置成为可转换的属性,但我会施加限制(例如,删除搜索功能),我需要保持不变。我真的希望 Core Data 有一种常规的方法来处理这种类型的模式——必须有很多例子说明通用实体类型很有用,但是如果你每次都必须向它添加反向关系,它就会变得很麻烦使用它 【参考方案1】:

没有收到任何答案,我将分享我在这种情况下开始使用的帮助模式:

基本上,我为每个特定用途从通用实体类型派生出一个实体类型,然后我可以适当地与派生的实体类型建立关系和反向关系。

例如,我可以有一个 PlayerLocation 实体类型和一个 PlayerOrigin 实体类型,两者都将通用“Location”作为它们的父实体类型(因此在面向对象的思维中,它们成为从 Location 基类派生的类)。然后一个 Player 实体类型可以有一个与 PlayerLocation 的一对一关系(位置)和一个与 PlayerOrigin 的一对一关系(原点),并且每个派生的位置类型都可以有唯一的反向关系(所有者)指向播放器。这是一张图片:

这可能会导致我创建比我最初设想的更多的实体类型,但它可以创建一个非常干净的对象模型,其中包含具有明确关系和反向关系的特定实体类型。

希望对其他人有所帮助。

【讨论】:

以上是关于Xcode Core Data 替代关系而不是通用类型的逆向关系的主要内容,如果未能解决你的问题,请参考以下文章

无法更改 Core Data Xcode 8.2 中的关系属性

手把手教你从 Core Data 迁移到 Realm

Core Data 根据是不是存在关系对描述符进行排序?

使用 xcode 和 core-data 中的代码创建托管对象

如何在通用 iOS 设备而不是模拟器上使用 FMDB?

在 Core Data 迁移期间添加关系 - 自我参考