2011-03-11 110 views
1

我使用NSPredicate與幾個<=構造來從Core Data存儲中提取對象,其中startDate屬性在2個日期之間,但我得到0個取出的對象。NSPredicate fetch核心數據對象的日期屬性在NSDate日期範圍內

這裏是我的NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"((%@ <= %K) && (%K <= %@))", fromDate, @"startTime", @"startTime", toDate]; 

這裏是控制檯輸出:

predicate: CAST(336261600.000000, "NSDate") <= startTime AND startTime <= CAST(339285599.000000, "NSDate") 
[sectionInfo numberOfObjects]: 0 

下面是在覈心數據(屬性類型設置爲日期)日期:

startTime 
--------- 
337249800 
337309200 
337318200 

fromDatetoDate都是NSDate對象。我試過用distantPastdistantFuture來代替這些,以便比我的核心數據startTime屬性在日期範圍內完全確定,並且仍然獲取0個對象。

我不知道爲什麼返回0個對象。任何人都可以看到我要去哪裏嗎?

回答

0

在生成的SQL查詢看它似乎像TIMESTAMP正在評估作爲一個字符串,而不是一個整數,之後才刪除此。這解釋了爲什麼我的謂詞不起作用。我通過在我用來預填充核心數據的SQLite數據庫上運行以下SQL查詢來確認這一點。

SELECT DISTINCT typeof(ZSTARTTIME) FROM ZMATCH; 

這表明TIMESTAMP字段的類型是BLOB!

將「+0」添加到我的謂詞中,以便將startTime屬性評估爲固定問題的整數。然而,這似乎是一個討厭的解決方案。同時將日期保存爲斑點很可能會導致問題進一步惡化。所以我回去重新填充SQLite數據庫,確保TIMESTAMPs被插入爲整數而不是字符串。現在一切正常。

但是這意味着我將不得不在下一次應用更新時做更多的工作,因爲我必須確保更新用新數據庫覆蓋了Documents文件夾中舊的SQLite數據庫。有沒有簡單的方法來做到這一點?我應該看看Core Data存儲遷移?

2

我會通過添加下面的可執行文件的參數啓動:

-com.apple.CoreData.SQLDebug 1 

這將噴涌當你運行你的應用程序的調試信息發送到控制檯的gigajazillion線,但它還應包括有關信息預測它試圖轉換爲SQL,甚至可能爲什麼它不起作用。

你會明顯地要打開裝運您的應用程序:)

+0

感謝戴夫,這幫助我解決了這個問題(請參閱我的回答):-) – mattvick

+0

@MattVick:很高興你知道了。我們表示感謝的方式是對您發現的問題進行回答,以幫助您。 –