2012-05-06 40 views
0

我有一個核心數據導入器,它循環訪問數據,並在導入過程中忽略重複的記錄。提取未保存的數據時奇怪的核心數據行爲

但我發現我的NSFetchRequest未與未保存的最近存儲的記錄匹配。我看到看似完全相同的查詢提供了不同的和意想不到的結果。

例如,在我的測試中,我發現,這個查詢匹配,並返回結果:

fetchTest.predicate = [NSPredicate predicateWithFormat:@"%K = 3882", @"intEmployee_id"]; 

但是,這看似相同的一個不:

fetchTest.predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id", @"3882"]; 

但是 - 它們都匹配後相同上下文被保存到持久存儲中。

Apple的文檔說,提取應該在默認情況下針對掛起的更改工作,實際上我確定[fetchTest includesPendingChanges] = YES。

任何想法究竟在這裏發生什麼?這兩次獲取可能返回不同的結果怎麼可能?

回答

1

也許員工ID不是一個字符串,而是一個數字?那麼謂詞應該是:

[NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id", 
              [NSNumber numberWithInt:3882]]; 

這意味着不規律行爲來自混合類型。它仍然以某種方式工作,即使不正常,因爲在SQLite文檔中,它表示SQLite在物理存儲數據時實際上並不按類型進行區分。

請參閱Distinctive Features of SQLite從SQLite的網站,標題艙單打字

+0

我認爲你可能會做些什麼...我習慣了SQLite不能根據類型進行區分,到目前爲止我所有的Core Data實驗都沒有問題,即使下面的數據字段是一個號碼。 – radven

+0

然後這就是它。核心數據有意隱藏數據庫層。你預期的行爲是不可預測的。查詢ID的正確方法是上面的代碼。嘗試一下,讓我知道它是否解決了這個問題。 – Mundi

1

這些實際上不會評估爲相同的值。

[NSPredicate predicateWithFormat:@"%K = 3882", @"intEmployee_id"] 

評估爲intEmployee_id = 3882

[NSPredicate predicateWithFormat:@"%K = %@", @"intEmployee_id", @"3882"] 

評估爲intEmployee_id = "3882"

使用數字而不是爲ID字符串的嘗試。

+0

確實 - 我注意到他們評估這兩個不同的查詢字符串,但是他們在數據庫被保存到持久性存儲庫後執行完全相同的操作,但之前沒有。 – radven

+1

我會將此文件作爲Apple的一個錯誤進行歸檔,因爲它們在保存之前和之後應該具有相同的行爲......儘管它們**是**不同的,它們可能應該評估相同。 – lnafziger

+1

完成 - 雷達ID:11394751 – radven