【问题标题】:CoreData - Fetch request with relationship objectCoreData - 使用关系对象获取请求
【发布时间】:2014-02-19 15:50:36
【问题描述】:

请确认我是否理解正确...

假设有一个实体“person”和一个实体“credit_card”。 所以一个“人”可以有许多“信用卡”。

人物实体具有以下属性:姓名:STRING年龄:INT 和关系:creditcards(对许多)逆向

并且信用卡实体具有:card_number: INTvalid_date: DATE 和关系:card_user(对一)逆

在我的代码中,我有一个名为 f.e. 的特定人员 (ManagedObject)。人 *currentUser。如果我现在想获取这个特定人的所有信用卡具有特定的“有效日期”,我将创建一个具有以下谓词的获取请求(针对实体“信用卡”):

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

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

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

【问题讨论】:

  • [NSPredicate predicateWithFormat:@"card_user == %@ AND valid_date == %@", currentUser, date];

标签: ios nspredicate relationships


【解决方案1】:

如果我正确理解了您想要的内容,您需要做的就是使用 Person *currentUser 上的 creditcards 属性并将其过滤掉:

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

您告诉CoreData 有关关系的原因是为了避免从头开始进行另一个查询。

【讨论】:

  • 嗯好的^^。我的错。不需要获取请求。我应该从信用卡集中获得具有正确“有效日期”的信用卡。不是吗?
  • 您不需要第二次获取请求,但您可以利用您对 NSPredicate 的了解快速过滤集合
【解决方案2】:

如果您已正确设置核心数据模型,则无需使用 ANY 关键字。特别是信用卡需要与人对象建立人关系(如果你没有这样做,你应该得到警告)。然后你可以像这样将两个谓词组合成一个

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多