如何在 CoreData 中正确建立复杂的关系?

Posted

技术标签:

【中文标题】如何在 CoreData 中正确建立复杂的关系?【英文标题】:How to build complex relationships in CoreData correctly? 【发布时间】:2021-12-24 13:02:14 【问题描述】:

我正在处理CoreData,为了培训,我决定创建一个记录用户收入和支出的小应用程序。 CoreData 教程都包含 To-Do-List 示例,我还没有找到任何可以帮助我的好示例。

// MARK: - Grammar 
// I want to apologize for grammatical errors in the text. Unfortunately,
// English is not my native language, so in some places I used a translator.

如果有什么不清楚的地方,我一定会再解释一遍。

当我开始考虑如何实现应用程序时,我认为最方便的方法是保存所有用户操作并在应用程序中的正确位置进行计算。到目前为止,抽象,因为在我看来这与问题关系不大,如果您需要更精确,我可以提供一个完整的想法。

所以,我要保存用户模型,其中将包含以下数据:

用户操作(操作类型) - 所有操作都将被保存,每个操作包括执行操作的类别,以及货币金额。

用户选择的类别(类别类型)- 添加操作时将用于支出或收入的类别。

Wallets (Type Wallet) - 用户的钱包,一切都很简单,名字,上面的余额。

预算单位(BudgetUnit 类型)- 这些是用户预算,包含一个类别和一个预算。例如:产品 - 10.000 美元

当我开始在 CoreData 中构建依赖项时,我遇到了一些奇怪的行为。

即用户与预算单位和操作在同一类别模型上具有关系。有些东西告诉我,它不会那样工作。 我希望用户类别是独立的,他选择了它们,我将它们显示在主屏幕上,每个操作都会有自己的类别模型

上图中,类别模型用了3次,同一个模型。

这大概是我表示我希望看到的数据结构的方式。不同的模型有自己的类别模型,独立于其他模型。

我认为它可以使用具有相同值的 3 个不同模型来实现,但在我看来,这种方法被认为是错误的。

那么您如何正确实现数据模型以使一切按预期工作?如果有任何帮助,我将不胜感激!

--- 编辑---

作为问题的解决方案,我可以创建多个实体为Category(示例如下)

但我不知道这是否是个好习惯

【问题讨论】:

这对我来说有点过于复杂了。正如我所看到的,一个用户有一个(或多个)钱包,一个钱包包含许多操作(我将它们命名为交易),其中钱包的余额等于操作中货币属性的总和。每个操作都有一个类别(类别在其他地方没有使用)。我省略了 BudgetUnit,因为我不确定它的用途。因此,总而言之,用户只与 Operation(可能还有 BudgetUnit)有关系,但没有更多关系。 @JoakimDanielson 重点是还使用了类别。用户已选择类别,当用户添加新的费用或收入时,需要选择其中一个类别来保存交易 完全同意@JoakimDanielson - 只需补充一点,如果您需要在其他实体之间共享像“类别”这样的实体,您可以简单地用 UUID 替换直接关系。这样可以避免很多麻烦。然后,您的经理中有一个吸气剂,例如 fetchCategory(with uuid: UUID) 来检索共享对象。这种方法去除了模型中的许多结,大大简化了方案。 【参考方案1】:

我查看了其他几个开源项目并找到了解决问题的方法。

我希望这对将来的某人有所帮助。

无需为用户保存类别,您只需在应用程序中添加IsSelectedID参数即可保存类别,以便在选择类别时更改这些参数,并且立即了解您需要显示哪些。

对于预算和运营(交易),我们只需要保存类别ID即可立即显示正确的。

例如:

感谢 @JoakimDanielson@Moose 的帮助。它让我对这个主题有了不同的看法。

【讨论】:

以上是关于如何在 CoreData 中正确建立复杂的关系?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data - 如何在不同的上下文中建立两个对象之间的关系

在 CoreData 中建立关系

映射核心数据关系的正确方法

如何检查关系是不是已建立 - Core Data

SwiftUI:CoreData 和复杂的 JSON

使用 UIPickerView 建立 CoreData 关系