创建核心数据反向关系

Posted

技术标签:

【中文标题】创建核心数据反向关系【英文标题】:Creating a Core Data Inverse Relationship 【发布时间】:2009-03-10 19:34:29 【问题描述】:

我正在尝试编写我的第一个 Cocoa 应用程序,而 Core Data 使我的数据对象建模变得困难。我有两个要操作的实体:AccountTransactionAccount 有一个人类可读的名称,仅此而已。 Transaction 存储一个货币值,并引用两个名为 debitAccountcreditAccount 的帐户(我正在开发一个双帐簿会计应用程序)。

我希望能够找到给定Account 的所有Transactions,无论他们使用debitAccount 还是creditAccount。我怎样才能做到这一点?有没有一种方法可以轻松地与 Cocoa UI 绑定一起工作?

【问题讨论】:

【参考方案1】:

如果我理解正确,您希望 Transaction 通过两个关系与 Account 相关:debitAccountcreditAccount,是吗?而且您想知道如何创建反向关系。

简而言之,一种关系只能是另一种关系的逆。因此,您将无法创建称为transactions 的关系,它是debitAccountcreditAccount 的逆关系。相反,您必须创建两个关系,例如 debitTransactionscreditTransactions(我相信您会为它们想出更合适的名称...)

现在,由于关系被建模为集合(特别是 NSSets),因此您可以合并特定帐户的 creditTransactionsdebitTransactions 关系以获取该帐户所涉及的所有交易。

一个(可能更好的)替代方法是引入一个中间实体,其名称类似于TransactionAccount,它与AccountTransaction 以及一个属性(例如accountRole)具有一对一的关系将账户标识为与该特定交易相关的借方或贷方账户。您将在 TransactionAccount 上创建反向多对多关系,名称类似于 transactionAccounts。这样,您可以编写如下内容:

[account valueForKeyPath:@"transactionAccounts.transaction"]

获取特定帐户的所有交易。您可以使用NSPredicate 将集合过滤为仅帐户为借记/贷记帐户的交易。

【讨论】:

感谢您的建议!我找到了一种对我有用的方法,但您的意见有所帮助。【参考方案2】:

对我来说效果最好(并且最有意义)的解决方案是创建NSManagedObject 的子类以用作我的Account 实体:

@interface Account : NSManagedObject 


-(NSArray*)getTransactions;
@end

我在-getTransactions 中有实际的查找逻辑,手动操作并不难。到目前为止效果很好,特别是因为方法名称符合 KVO。

为了让 Core Data 返回 Accounts 而不是 NSManagedObjects,我必须在 Xcode 的数据建模工具中更改实体的“类”属性。

【讨论】:

小心。反向关系的原因是它们有助于确保模型的一致性。如果您删除了作为关系目标的对象并且它没有逆关系,则必须确保将其从该关系中删除,否则您将得到无效的引用。 该方法不应命名为“-getTransactions”,因为它不会通过引用返回事务集合。使用“-allTransactions”或类似的东西。

以上是关于创建核心数据反向关系的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:总是有反向关系。为啥?

核心数据反向关系

使用核心数据的父实体继承和反向关系

从核心数据获取请求中排除反向关系

核心数据反向关系未设置

核心数据继承 - 管理子类的反向关系