CoreData子查询具有多个条件,关系

时间:2011-10-20 18:09:13

标签: objective-c core-data subquery nspredicate

第一次发布海报,长期读者/搜索者!

我试图通过一对多CoreData关系从子查询返回信息。我有两个实体Customers和Messages。每个客户可以有多条消息。

我尝试做的是从Customers表中返回每个客户的账号,该客户的消息类型为“Temp-Stop”,生效日期小于明天的日期。

我尝试使用ANY和NONE的组合,没有子查询,但发现它们没有按我的意愿工作。最后,我使用了一个子查询。

如下所示,它返回过去Temp-Stops的客户数,但我需要这些客户的帐号。需要明确的是,最终目标是确定客户在明天的日期之前是否还有“重新启动”类型的消息。这意味着它们不再停止,应该包含在活跃客户列表中。

(此处有图片,但因为我是新用户而无法发布)

NSPredicate *predTemps = [NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, $m.effective < %@ && $m.type == 'Temp Stop').@count > 0", tomorrow];

上述谓词返回过去Temp-Stops的客户数量。我也能够将子查询中的帐号引用作为第三个条件,但我想返回帐号号码,而不是指定它们。

NSPredicate *predTemps = [NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, $m.effective < %@ && $m.type == 'Temp Stop').account", tomorrow];

这正是我想要的 - 尽管它不起作用。我不清楚如何实现子查询,所以也许还有另一个解决方案。

非常感谢!

1 个答案:

答案 0 :(得分:1)

由于您的查询仅 Message实体中的属性进行过滤,因此您没有直接针对Message实体而不是其“父级”运行谓词的原因“?

根据您问题中的信息,您似乎可以针对NSFetchRequest实体运行Message,然后如果您需要有关其父级的信息,则可以通过反向关系访问它。

这样,您就可以通过返回的Message个实例访问该帐户。

请记住,Core Data是一个对象图,而不是一个数据库。因此,您希望返回并使用对象(消息)而不是列(帐户)。一旦你得到了对象,你可以从中获得帐户价值。

更新

这是伪代码来解释我的意思。

NSManagedObjectContext *moc = ...;
NSDate *effectiveDate = ...;
NSError *error = nil;
NSFetchRequest *request = nil;
NSPredicate *pred = nil;

request = [NSFetchRequest fetchRequestWithEntityName:@"Message"];
pred = [NSPredicate predicateWithFormat:@"effective < %@ && type == 'Temp Stop'", effectiveDate];
[request setPredicate:pred];

NSArray *results = [moc executeFetchRequest:request error:&error];
NSAssert2(!error || results, @"Error fetching results: %@\n%@", [error localizedDescription], [error userInfo]);

NSArray *customers = [results valueForKey:@"customer"];

return customers;