2010-10-26 29 views
3

我發現一個NSFetchRequest正在爲計數和執行返回不同的結果。countForFetchRequest和executeFetchRequest返回不同數量的結果

我有一個Product實體和一個Size實體。產品有很多尺寸。

我有兩個產品productA和productB。 ProductA僅適用於size1,productB適用於size1和size2。

鑑於NSPredicate

ANY sizes.#size IN {"size1", "size2"}

我發現它爲countForfetchRequest返回3但2項的數組當我執行該找取請求。

計數值是不正確的。 ProductB具有兩種尺寸,似乎在countForfetchRequest中被計數​​兩次,但顯然只有executeFetchRequest呼叫返回一次。

我試過設置setReturnsDistinctResults:YES沒有效果。

+0

難道你在進行計數呼叫時有一個髒的管理對象上下文?即在上下文中有一個臨時對象可能會拋出計數,或者這兩個調用是否緊接着返回? – ImHuntingWabbits 2010-11-04 07:11:05

+0

在相同的託管環境下背靠背。而且錯誤是完全可重複的,所以上下文不會被任何其他線程錯誤地使用等。我喜歡這個想法。我沒有想到這一點! – deanWombourne 2010-11-04 11:54:23

+0

這很有趣,我認爲它唯一能做的就是將每個對象與數組中的n個值匹配n次。因此,您有2個對象,但有3個匹配的實際#大小。我認爲通過將您的大小關係更改爲單個實體並檢查計數結果可以很容易地進行驗證。 – ImHuntingWabbits 2010-11-04 16:59:08

回答

1

我稍微修改了答案中的謂詞。請注意,關於您可能遇到的解析問題(在我之前的評論中給出)的相同考慮仍然適用。我假設你有多個尺寸,說SIZEA,sizeB,sizeC等你需要一個子查詢到與核心數據的一對多關係正確對待,如下面的謂詞

編輯:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"([email protected] == 1 || [email protected] == 2) && (1 == SUBQUERY(sizes, $sub, $sub.#size == %@ || $sub.#size == %@)[email protected] || 2 == SUBQUERY(sizes, $sub, $sub.#size == %@ || $sub.#size == %@)[email protected])", yourSizeAvariable, yourSizeBvariable]; 

讓我知道這是否適合你。

+0

我有兩個問題 - 首先,無論我嘗試什麼,我總是得到錯誤__Unable來解析格式化字符串___。其次,我沒有看到這將如何幫助我的查詢 - 這個子查詢將返回一個尺寸集合 - 然後我如何測試我的產品對這個集合 - 我真的希望這個例外有點幫助我調試一些: ( – deanWombourne 2010-11-09 18:21:34

+0

該查詢在針對Product實體運行時應該返回所有具有sizeA或sizeB(或兩者)的產品。解析問題可能與使用#來轉義在Core中保留的「size」關鍵字有關如果可能,嘗試將「size」屬性更改爲不同的內容,例如「dimension」,然後相應地更改謂詞,刪除# – 2010-11-09 21:23:35

+0

關於您的問題「我沒有看到這將如何幫助我的查詢 - 這個子查詢將返回一個大小集合 - 然後我如何測試我的產品對這個集合「:這是不正確的。請記住,您對產品實體運行查詢,因此,你一個主要是找回產品,而不是尺寸:你可以找回尺寸與你指定的尺寸完全一致的產品。但是,爲了簡化這一點,新謂詞現在檢查計數,返回與計數匹配的產品。 – 2010-11-10 06:22:42

0

我想當你做一個計數,它是從sql查詢返回的行數。在查詢大小表時,您會返回3,因爲等效的sql將返回3行。

當您執行提取操作時,您將得到2,因爲您只會取回兩個產品對象。但是,如果你看這些產品的尺寸對象的數量裏面,你會發現3

哦,選擇不同將無法工作,因爲你有3個唯一值的集合:-)

+0

是的,你是絕對正確的 - 事實證明我需要一個子查詢來刪除:(我只是假設(不正確),他們會返回相同的號碼 - @unforgiven指出我在正確的軌道上:)謝謝。 – deanWombourne 2010-11-10 09:50:01