0

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

  • 文档实体有很多命令
  • 命令属于文档

  • 文档有很多标签

  • 标签有很多文档

这很重要,因为用于此类关系的附加表

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

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

我尝试使用谓词进行子查询:

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

不幸的是,它试图加入管理 Document 和 Tag 之间关系的中间表。所以它导致抱怨它在那里找不到归档的“类型”,因为它只有 Document id 和 Tag id,这不是我所期望的。看起来它适用于除多对多之外的所有其他关系,但在这种情况下它已经丢失了。

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

这个也不起作用,因为它只在 SQL 中留下 NOT ,并且由于与许多类型的标签的关系,它会在找到的每个 Document 中重新出现。所以它总是会找到至少一个类型不是类型 TagTypeUnwanted 的记录。

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


看起来 NOT ANY 和 NONE 都不能在 Core Data 中工作,据我所知,这是自 2007 年以来的一个已知问题,通常你会做子查询来解决这个问题,但在这种情况下,子查询似乎无法处理很多 -对多表

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

4

1 回答 1

1

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

[NSPredicate predicateWithFormat:
    @"SUBQUERY(document, $doc, SUBQUERY($doc.tags, $tag, $tag.type == %d).@count == 0) != NULL",
    TagTypeUnwanted]
于 2012-11-26T18:57:36.400 回答