【问题标题】:CoreData many-to-many relation (sub)queryCoreData 多对多关系(子)查询
【发布时间】:2012-11-09 12:06:05
【问题描述】:

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

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

  • 文档有很多标签

  • 标签有很多文档

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

标签还有一个类型属性,它是一个整数,是一个枚举。

我试图实现的是向 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 的实际外观

【问题讨论】:

  • 在我看来,第二个版本(NOT ANY ...)应该可以工作。您能否提供一个查询未给出预期结果的小数据集?
  • 我刚刚添加了答案的第二部分,我在其中解释了为什么 NOT ANY 不起作用,这是一个已知问题

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


【解决方案1】:

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

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

【讨论】:

  • 是的,这个给出了预期的结果,确实很有趣。但正如您所说,性能方面它可能会杀死数据库,因为它应该可以与几十万个命令一起正常工作。可能这最终会在两个查询中完成。尽管如此,这个谓词是有效的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
相关资源
最近更新 更多