2011-04-21 100 views
46

我有ManagedObject class,並且該類的其中一個成員是NSDate。我想顯示日期未設置的類的所有對象。我試圖用一個謂詞是這樣的:如何設置NSPredicate以查找具有零屬性的對象

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"]; 

但是我還是在date設置對象。建立謂詞的正確方法是什麼?

回答

93

我認爲這是一個區分大小寫的問題。你可以使用「nil」或「NULL」,但不能使用「NIL」。這對我來說工作得很好:

NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"]; 
+1

你知道爲什麼格式應該是@「endDate = nil」而不是@「endDate == nil」嗎?我會認爲它應該是雙等號,但在這種情況下==不會產生所需的效果。奇怪,因爲其他謂詞比較可以用==工作。 – kris 2011-10-27 19:14:46

+1

@kris我不確定。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-SW1似乎表明'='和'= ='是等價的,但http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-SW4中的例子使用' =' – 2011-10-27 21:31:48

+10

謝謝。我看到=和==在這個cirsumstance中表現不一樣,所以每個人都要面對 – kris 2011-10-27 21:35:13

9

想通了。無法通過使用帶有字符串格式的謂詞來做到這一點,所以嘗試了一個帶模板的謂詞,它的工作原理。以下代碼給了我endDate設置爲NULL的對象:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"endDate = $DATE"]; 
predicate = [predicate predicateWithSubstitutionVariables: 
        [NSDictionary dictionaryWithObject:[NSNull null] forKey: @"DATE"]]; 
+0

坦白說,考慮到他和克里斯討論的謂詞測試中的語法不規律性,我認爲這樣做比下面更簡單的例子chrispix給出的更安全。 – Wienke 2012-02-20 19:09:37

+0

謝謝!但是如果它需要兩個過濾器變量,你將如何過濾?謝謝 – KarenAnne 2013-04-10 06:36:17

+0

標記@mezulu – KarenAnne 2013-04-10 06:36:59

0

有擷取要求的超令人討厭的行爲,如記錄由蘋果:

如果上下文中的一個對象已被修改,謂詞將根據其修改狀態進行評估,而不是針對該狀態持久存儲中的當前狀態。因此,如果上下文中的對象已被修改爲滿足獲取請求的條件,則即使未將更改保存到存儲並且存儲中的值不符合條件,該請求也會檢索該請求。相反,如果上下文中的某個對象已被修改,使其與提取請求不匹配,則即使存儲中的版本匹配,提取請求也不會檢索它。

很可能是因爲您在別處結算日期和取請求包括結果其中的日期是在內存中nil,但在磁盤上仍然設置(持久存儲),所以當對象的故障,它加載了對象與日期設置。

我唯一的建議是協調對託管對象上下文的訪問(比如說,在NSOperationQueue上),以便在執行提取請求之前可以將任何更新保存到持久性存儲中。

相關問題