核心数据多对多关系(子查询

时间:2012-11-21 09:17:15

标签: objective-c ios macos cocoa core-data

我有一个具有以下结构的模型:

  • 文档实体有许多命令
  • 命令属于Document

  • 文档有很多标记

  • 标签有很多文档

这很重要,因为此类关系使用了附加表

Tag还有一个type属性,它是一个整数,是一个枚举。

我尝试实现的是在单个查询中向CoreData请求属于与TagTypeUnwanted类型的标记没有关系的Documents的命令:)

我尝试使用谓词创建子查询:

[NSPredicate predicateWithFormat:@"SUBQUERY(document.tags, $tag, $tag.type == %d).@count == 0", TagTypeUnwanted]

不幸的是,它试图加入管理Document和Tag之间关系的中间表。所以它导致抱怨它找不到那里的'type',因为它只有Document id和Tag id,这不是我的预期。它似乎适用于除了多对多之外的所有其他关系,在这种情况下它会丢失。

[NSPredicate predicateWithFormat:@"NOT ANY document.tags.type == %d", TagTypeUnwanted]

这个也不起作用,因为它只在SQL中留下NOT,并且它因为与许多类型的标签的关系而在每个被发现的Document中都会被删除。因此,它总是会找到至少一个类型为非类型TagTypeUnwanted的记录。

如果您想了解更多信息或生成SQL或其他内容,请将其写入评论中。提前谢谢!


看起来没有任何和NONE都没有在Core Data中工作,只要我能够检查它是自2007年以来的一个已知问题,通常你做子查询来解决这个问题,但看起来像子查询在这种情况下不能处理多对多表

NOT ANY生成:AND NOT(Tag.type == TagTypeUnwanted)所以它只接近SQL的外观

1 个答案:

答案 0 :(得分:1)

这可能不是很有效,但以下嵌套的SUBQUERY似乎有用可能很有趣:

[NSPredicate predicateWithFormat:
    @"SUBQUERY(document, $doc, SUBQUERY($doc.tags, $tag, $tag.type == %d).@count == 0) != NULL",
    TagTypeUnwanted]