第一次发布海报,长期读者/搜索者!
我试图通过一对多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];
这正是我想要的 - 尽管它不起作用。我不清楚如何实现子查询,所以也许还有另一个解决方案。
非常感谢!
答案 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;