核心数据 - 使用关系对象获取请求

时间:2014-02-19 15:50:37

标签: ios nspredicate relationships

请确认我是否明白...

想象一下,有一个实体'人'和一个实体'credit_card'。 所以一个'人'可以拥有很多'credit_card'。

人物实体具有以下属性:名称:STRING 年龄:INT 和关系:信用卡(对许多人来说)反向

并且信用卡实体具有: card_number:INT valid_date:DATE 和关系: card_user (到一个)逆

在我的代码中,我有一个名为f.e的特定人(ManagedObject)。人 * currentUser 。如果我现在想要使用特定的'valid_date'获取此特定人的所有信用卡,我将使用以下谓词创建获取请求(对于实体'credit_card'):

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:
@"valid_date == <NSDate object>"];

NSPredicate *predicate2 = [NSPredicate predicateWithFormat:
@"ANY card_user like currentUser"];

这个谓词适合我,但这是正确的方法吗?我应该真的要求:“任何关系名称,如 ManagedObject ”?

2 个答案:

答案 0 :(得分:0)

如果我理解你想要什么,你需要做的就是使用creditcards上的Person *currentUser属性并过滤掉它:

NSSet *setOfCreditCards = currentUser.creditcards;
NSPredicate *filter = [NSPredicate predicateWithFormat: @"valid_date == %@", date];
NSSet *cardsWithValidDates = [setOfCreditCards filteredSetUsingPredicate:filter];

您告诉CoreData关于关系的原因是避免从头开始进行另一次查询。

答案 1 :(得分:0)

如果您已正确设置核心数据模型,则无需使用任何关键字。特别是信用卡需要将个人关系返回到person对象(如果你不这样做,你应该收到警告)。然后你可以将两个谓词组合成一个像这样的

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"person == %@ AND valid_date == %@", currentUser, valid_date];