CoreData多对多关系(子)查询

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

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

  • 文档有很多标签

  • 标签有很多文档

这很重要,因为此类关系使用了额外的表

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

我尝试实现的是在CoreData中查询属于Documents的命令,这些命令与TagTypeUnwanted类型的标记没有关系,显然在单个查询中:)

我试图用谓词创建一个子查询:

[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中都会被删除。 所以它总会找到至少一个记录,其中type不是类型TagTypeUnwanted。

如果您喜欢更多信息或生成SQL或任何内容,只需将其写在注释中即可。 提前致谢!


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

NOT ANY生成:AND NOT(Tag.type == TagTypeUnwanted)所以它只接近SQL应该看起来的样子

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

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