目标C - 从核心数据中检索一对多关系数据

时间:2013-07-09 12:43:08

标签: ios objective-c core-data

enter image description here

我有一个核心数据模型(简化了以便更容易解释我想要做什么)。

作者可以出版很多书,一本书可以有很多章节。 在示例中,我想要检索所有在书中有章节的Autor,其中readDate为null。

- (NSArray *)incompleteChaptersInManagedObjectContext:(NSManagedObjectContext *)context
{
    NSFetchRequest* fetch = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Author class])];
    NSPredicate* uidCondition = [NSPredicate predicateWithFormat:@"books.chapters.readDate!=nil"];
    [fetch setPredicate:uidCondition];

    NSArray* resultArray = [context executeFetchRequest:fetch error:&error];

..
..

这不起作用,我正在努力寻找如何做到这一点。 目前我 声明作者mutablearray。 - 得到所有作者      - 遍历他们的所有书籍            - 循环遍历所有章节            - 如果readDate为null,则将其添加到作者数组

这有效,但我想在没有嵌套循环的情况下解决这个问题。

4 个答案:

答案 0 :(得分:7)

对于嵌套的多对象关系,SUBQUERY是必要的(正如@geo已经正确地说过)。 但是一个SUBQUERY就足够了:

[NSPredicate predicateWithFormat:@"SUBQUERY(books, $b, ANY $b.chapters.readData == NULL).@count > 0"]

(我认为“书籍”和“章节”真的是很多关系,即使你的 图表显示了它们之间的关系。)

答案 1 :(得分:3)

这看起来像是SUBQUERY

的情况
NSFetchRequest* fetch = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Author class])];

[NSPredicate predicateWithFormat:@"(SUBQUERY(books, $cd, SUBQUERY($cd.chapters, $m, $m.readDate == NULL).@count != 0).@count != 0"];
[fetch setPredicate:uidCondition];

不确定在dataBase中检查是否为== nil或NULL。我只是检查价值,所以目前无法说明这一点

答案 2 :(得分:0)

根据您之后需要处理的数据,不要忘记您还可以获取readDate为零的章节,然后返回书籍和作者。

答案 3 :(得分:0)

您还可以签出Sensible TableView框架,该框架将处理所有Core Data提取并自动显示表视图中的数据。节省了大量的时间。