创建核心数据反向关系

时间:2009-03-10 19:34:29

标签: cocoa core-data

我正在尝试编写我的第一个Cocoa应用程序,Core Data使我很难对我的数据对象进行建模。我有两个要操作的实体:AccountTransactionAccount有一个人类可读的名称,就是它。 Transaction存储货币值,并引用两个名为debitAccountcreditAccount的帐户(我正在制作双书会计应用)。

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

2 个答案:

答案 0 :(得分:4)

如果我理解正确,您希望通过两种关系将交易与帐户相关联:debitAccountcreditAccount,是吗?而且你想知道如何建立反向关系。

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

现在,由于关系被建模为集合(特别是NSSet s),您可以将特定帐户的creditTransactionsdebitTransactions关系联合起来以获取涉及帐户的所有交易用。

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

[account valueForKeyPath:@"transactionAccounts.transaction"]

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

答案 1 :(得分:0)

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

@interface Account : NSManagedObject {

}
-(NSArray*)getTransactions;
@end

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

要使Core Data返回Account而不是NSManagedObject,我必须在Xcode的数据建模工具中更改实体的“Class”属性。