2010-08-10 84 views
27

我有一個名爲Entry的核心數據模型對象。 在這我有一個屬性IsFavorite。NSPredicate - 基於布爾值存儲值篩選值

我想使用NSPredicate來過濾我的NSFetchedResultsController的結果。

當執行提取時,我正在獲取EXC_BAD_ACCESS。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
// Edit the entity name as appropriate. 

NSEntityDescription *thisEntry = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:managedObjectContext_]; 
[fetchRequest setEntity:thisEntry]; 

NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"Entry.isFavorite == %@", [NSNumber numberWithBool: YES]]; 

[fetchRequest setPredicate:predicate]; 


NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 


NSError *error = nil; 
if (![aFetchedResultsController performFetch:&error]) { 
    NSlog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

如果我刪除在fetchRequest上設置謂詞的行,我的代碼將完美執行。

我在謂詞上顯然是n00bin,但在試圖找出如何從核心數據模型對象的BOOLEAN值上執行操作時遇到了很多麻煩。請注意,有關如何使用字符串或整型值執行此操作的答案,但我找不到BOOLEAN示例。

非常感謝!

回答

37

這不是NSPredicate所特有的......只要格式字符串中有%@,相應的值必須是指向對象的指針,BOOL不具有限定條件。所以不是通過YES,而是通過[NSNumber numberWithBool: YES]


在Xcode中的新版本和軟件開發工具包比我原來寫的答案,你可以使用@YES而不是[NSNumber numberWithBool: YES]

+0

我已經更新了我上面的代碼 - 這仍與EXC_BAD_ACCESS崩潰:( 會不會是實體。如果我使用了這樣的NSNumber描述 ''[[NSNumber numberWithBool:NO] ='我寫了'或只是屬性=? – Lance 2010-08-10 01:53:20

+0

這不是取得崩潰的應用程序 - 謝謝你的幫助 – Lance 2010-08-10 01:59:38

+1

這對我有用,描述];' – 2011-04-20 18:50:34

22

如果你知道你正在尋找一個YES(因此不需要或在不同情況下YES之間切換NO),這個工作對我來說:

[NSPredicate predicateWithFormat:@"isFavorite == 1"] 
+0

它應該是一個動態值。 – KETAN 2012-06-11 06:58:53

+5

@KETAN如果你知道你正在尋找YES,那麼@「isFavorite == YES」將會起作用。 – brodney 2013-02-18 21:31:50

+0

我認爲你應該使用「%@」,@YES – OMGPOP 2014-02-01 09:37:49

-1

對於我來說,像這樣工作

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(isComplete LIKE[c] %@)",[NSString stringWithFormat:@"%@",[NSNumber numberWithBool:YES]]]; 
27

從蘋果公司的文檔:

布爾值

您指定並測試如下面的例子說明的布爾值的平等:

NSPredicate *newPredicate = 
    [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]]; 
NSPredicate *testForTrue = 
    [NSPredicate predicateWithFormat:@"anAttribute == YES"]; 

然而,有些東西,引起了我出去:

一定要勾去掉Optional實體屬性和設置Default ValueYESNO,否則該列將爲空(空?),並且上述謂詞將不匹配未明確設置的行。

我使用偉大的應用程序sqllitebrowser來診斷這一個,通過查看生成的模擬器數據庫。

+0

對不起@亞諾斯我還不太瞭解斯威夫特。 – scipilot 2015-01-22 10:04:11

+0

非常感謝您指出「確保取消選擇可選實體屬性」。節省了我的時間! – 2015-04-04 22:52:20

+0

很高興幫助!我花了幾個小時在上面......現在我更關注那個右側面板,直到那時我纔會忽略它。 – scipilot 2015-04-05 05:20:00

0

對我而言,SWIFT 3。0使用的NSNumber和%@沒有工作,我不得不用整數值:

NSPredicate(format: "yourAttributeName == %i", yourBooleanValue ? 1 : 0) 
1

迅速3版對我來說真是棒極了:

let predicate = NSPredicate(format: "isFriend == %@" ,NSNumber(booleanLiteral: false)) 

以下@scipilot回答布爾不應是可選的。感謝那!

0

iOS上的10時,Xcode 9.0,尋找與布爾NO屬性的核心數據managedObject:

[NSPredicate predicateWithFormat:@"attributeName == nil"]