2012-11-21 108 views
0

我有以下結構的模型:CoreData許多一對多的關係(子)查詢

  • 文檔實體有很多命令
  • 命令屬於文檔

  • 文件有許多標籤

  • 標籤有許多文件

這是因爲用於這種類型的關係附加表的重要

標籤還具有類型屬性,它是一個整數是一個枚舉。

我儘量做到是要求CoreData爲屬於不具有類型TagTypeUnwanted的標籤的關係一個文件的命令,顯然在一個查詢:)

我試圖做一個子查詢有謂:

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

可惜的是它會嘗試與管理文件和標籤之間的關係中間表加入。所以它會導致抱怨它無法在那裏找到「提交」類型,因爲它只有Document id和Tag id,這不是我所期望的。看起來它會適用於所有其他關係,而不是多對多關係,但在這種情況下,它會丟失。

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

這一個也沒有,因爲它只剩不是SQL和工作,它在每一個文件實物仿真試驗結果被因爲有許多類型的標籤關係的發現。所以它總能找到至少一個記錄,其中類型不是TagTypeUnwanted。

如果您希望瞭解更多信息或生成SQL或任何其他內容,請將其寫入註釋中。提前致謝!


看起來沒有什麼,沒有這兩個核心數據都沒有工作,據我可以檢查它是自2007年以來的已知問題,通常你做的子查詢來解決此,但它似乎像子查詢在這種情況下,不能處理許多一對多表

又沒產生:AND NOT(Tag.type == TagTypeUnwanted),所以它只是接近SQL如何應該看看

+0

在我看來,第二個版本(不是任何...)應該可以工作。你能提供一個小的數據集,查詢不會給出預期的結果嗎? –

+0

我剛剛添加了答案的第二部分,我解釋了爲什麼NOT ANY不工作,這是一個已知問題 –

回答

1

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

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

是的,這一個給出了預期的結果,確實很有趣。但正如你所說,性能明智,它可能會殺死數據庫,因爲它應該適用於幾十萬個命令。這可能最終會以兩個問題完成。儘管如此,這個謂詞正在工作:) –