【问题标题】:Objective C - one-many relationships data retrival from core dataObjective C - 从核心数据中检索一对多关系数据
【发布时间】:2013-07-09 12:43:08
【问题描述】:

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

一个作者可以出版很多本书,而一本书可以有很多章节。 在示例中,我想检索所有在书中有一章 readDate 为空的 Autors。

- (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];

..
..

这不起作用,我正在努力寻找如何做到这一点。 此刻我在 声明一个作者可变数组。 - 获取所有作者 - 循环浏览他们所有的书 - 循环浏览所有章节 - 如果 readDate 为 null,则将其添加到作者数组中

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

【问题讨论】:

  • 当你运行上面的代码时你的输出是什么?另外,将 books.chapters.readDate!=nil 更改为 books.chapters.readDate==nil

标签: ios objective-c core-data


【解决方案1】:

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

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

(我假设“书籍”和“章节”实际上是一对多的关系,即使您的 图表将它们显示为一对一的关系。)

【讨论】:

  • 如果章节也是一个 NSSet,是否仍然可以使用 .操作员?我确定我前段时间尝试过这个,第二个 SUBQUERY 是必要的:/但如果它有效,那很好:)
  • @geo:据我所知,ANY a.b.c == d 在 lhs 上的恰好一个关系是“to-many”而其他关系是“to-一”。我没有检查过这个特定的查询,但它在类似的情况下也有效。
【解决方案2】:

这看起来像是: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];

不确定在数据库中检查的内容是 == nil 还是 NULL。我只是在检查值,所以目前无法判断

【讨论】:

  • 这应该也可以(+1)。比较生成的 SQLite 查询以查看是否存在差异可能会很有趣。
【解决方案3】:

根据你之后需要对数据做什么,不要忘记你也可以获取 readDate 为 nil 的章节,然后返回书籍和作者。

【讨论】:

  • 这是可能的,但是您必须一个一个地提取并且没有完整的数组作为结果;)可能,但不是那么实用:)
  • 当然。这就是我所说的“取决于你需要对结果做什么”:)
【解决方案4】:

您还可以查看 Sensible TableView 框架,该框架将处理所有核心数据获取并自动在表格视图中显示数据。为我节省了大量时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多