【发布时间】:2016-04-06 13:48:30
【问题描述】:
我有三个这样的实体: 出版商 > 作者 > 书籍
Publisher{
id = <uniqueId>
authors -->> Author
}
Author{
id = <uniqueId>
books -->> Book //ordered relationship
publisher --> Publisher
}
Book{
info = <string_with_info>
author --> Author
}
我想按 Author id 和 Publisher id 过滤所有书籍并获取它们的 info 属性。类似于:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"author.publisher.id == %@ AND author.id == %@", publisherId, authorId];
[request setPredicate:predicate];
[request setEntity:[NSEntityDescription entityForName:@"Book" inManagedObjectContext:managedContext]];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
[request setPropertiesToFetch:@[@"info"]];
NSError *error = nil;
NSArray *results = [managedContext executeFetchRequest:request error:&error];
其中结果应该包含许多带有书籍信息的字符串。
我不确定author.publisher.id == %@ 部分是否有效。
我可以获取作者,然后获取带有书籍实体的 MutableSet。从那里我可以遍历它们并将它们的信息推送到一个新数组。这可以完成这项工作,但如果可能的话,我想只用一个 fetch 来做同样的事情。
编辑:一个可行的解决方案是像这样改变谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(0 != SUBQUERY(author, $x, (0 != SUBQUERY($x.publisher, $y, $y.id like %@).@count)).@count) AND author.id like %@ ", publisherId, authorId];
一些澄清。作者 ID 与发布者相关联,并且仅对该发布者唯一。您可以有两个作者具有相同的 id 但具有不同的出版商。
扩展原始问题。作者书籍已订购。 results 中的信息的排序顺序是否与作者中书籍的排序顺序相同?根据我的有限测试,答案是肯定的。
Mundi 已指出可能的 id 冲突,并已记录。
【问题讨论】:
标签: ios core-data nspredicate nsfetchrequest