我正在尝试编写我的第一个Cocoa应用程序,Core Data使我很难对我的数据对象进行建模。我有两个要操作的实体:Account
和Transaction
。 Account
有一个人类可读的名称,就是它。 Transaction
存储货币值,并引用两个名为debitAccount
和creditAccount
的帐户(我正在制作双书会计应用)。
我希望能够找到给定Transactions
的所有Account
,无论他们使用debitAccount
还是creditAccount
。我怎样才能做到这一点?有没有办法可以轻松使用Cocoa UI绑定?
答案 0 :(得分:4)
如果我理解正确,您希望通过两种关系将交易与帐户相关联:debitAccount
和creditAccount
,是吗?而且你想知道如何建立反向关系。
简而言之,关系只能是另一种关系的逆转。因此,您无法创建一个称为transactions
的关系,它与debitAccount
和creditAccount
相反。相反,您必须创建两个关系,例如debitTransactions
和creditTransactions
(我相信您会想到更合适的名称......)
现在,由于关系被建模为集合(特别是NSSet
s),您可以将特定帐户的creditTransactions
和debitTransactions
关系联合起来以获取涉及帐户的所有交易用。
一个(可能更好)替代方案是引入一个中间实体,其名称类似于TransactionAccount
,与Account
和Transaction
具有一对一的关系,以及属性,如accountRole
,将帐户标识为相对于该特定交易的借方或贷方帐户。您可以在Transaction
和Account
上创建反向对多关系,其名称为transactionAccounts
。这样,你可以这样写:
[account valueForKeyPath:@"transactionAccounts.transaction"]
获取特定帐户的所有交易。您可以使用NSPredicate
将该集过滤为仅帐户为借记/贷记帐户的交易。
答案 1 :(得分:0)
对我来说效果最好(并且最有意义)的解决方案是创建NSManagedObject
的子类以用作我的Account
实体:
@interface Account : NSManagedObject {
}
-(NSArray*)getTransactions;
@end
我在-getTransactions
内部有实际的查找逻辑,手动操作并不难。到目前为止,这很好,特别是因为方法名称符合KVO。
要使Core Data返回Account
而不是NSManagedObject
,我必须在Xcode的数据建模工具中更改实体的“Class”属性。