2010-01-26 63 views
1

我想爲我的核心數據實體生成謂詞編輯器模板。在我的代碼我有以下:NSPredicateEditorRowTemplate和CoreData

NSEntityDescription *descrip = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext]; 
    NSArray *templates = [NSPredicateEditorRowTemplate templatesWithAttributeKeyPaths:[NSArray arrayWithObjects:@"name", @"age", nil] inEntityDescription:descrip]; 

    [ibPredicateEditor setRowTemplates: templates]; 

    NSPredicate *p = [NSPredicate predicateWithFormat:@"name like 'John'"]; 

    [ibPredicateEditor setObjectValue:p]; 

打印出來的模板陣列中的內容給我以下:

CFArray 0x1002d7400 [0x7fff70ff5f20] {類型=不可變的,計數= 2,值= ( 0:NSPredicateEditorRowTemplate 0x10025c090:[名稱] [99,4,5,8,9] NSStringAttributeType 1:NSPredicateEditorRowTemplate 0x1002d2dc0:[年齡] [4,5,0,2,1,3] NSInteger16AttributeType )}

當這個代碼執行我得到的控制檯上執行以下操作:

Warning - unable to find template matching predicate name LIKE "John" 

這樣做看起來非常簡單的,所以我似乎無法界面找出我我做錯了。任何幫助將不勝感激!

編輯

我原來的問題是,我用LIKE操作時,我的模板不支持它。然而,我爲什麼在將複合謂詞傳入編輯器時收到類似的警告而感到困惑。

NSPredicate *p = [NSPredicate predicateWithFormat:@"name CONTAINS 'John'"]; 
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"name CONTAINS 'Jo'"]; 
NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:p, p2, nil]]; 
[ibPredicateEditor setObjectValue: final]; 

OR

NSPredicate *final = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:p, p2, nil]]; 
[ibPredicateEditor setObjectValue: final]; 

這兩個產生了類似的警告是我最初的問題。然而,我覺得奇怪的是,我可以使用單個謂詞並構建複合詞和謂詞,但是我無法將預先構建的複合詞和謂詞傳遞給編輯器。

回答

2

通過NSPredicateEditorRowTemplateNSString關鍵路徑提供不支持與LIKE操作比較的默認模板。

在您生成的模板有它支持運營商的列表:

NSPredicateEditorRowTemplate 0x10025c090: [name] [99, 4, 5, 8, 9] NSStringAttributeType 

[99, 4, 5, 8, 9]表明名字NSString屬性支持:

- 等於
- 不等於
- 從012開始 - 完隨着
- 包含

(在NSComparisonPredicate.h找到)

CONTAINS類似於就像沒有%和_取代。如果您需要可以始終初始化您自己的模板數組。

語法是有點詳細。

NSExpression *nameExpression = [NSExpression expressionForKeyPath:@"name"]; 
NSArray *operators = [NSArray arrayWithObjects: 
     [NSNumber numberWithInt: NSEqualToPredicateOperatorType], 
     [NSNumber numberWithInt:NSNotEqualToPredicateOperatorType], 
     [NSNumber numberWithInt:NSLikePredicateOperatorType], 
     [NSNumber numberWithInt:NSBeginsWithPredicateOperatorType], 
     [NSNumber numberWithInt:NSEndsWithPredicateOperatorType], 
     [NSNumber numberWithInt:NSContainsPredicateOperatorType], 
     nil]; 

NSUInteger options = (NSCaseInsensitivePredicateOption | 
         NSDiacriticInsensitivePredicateOption); 

NSPredicateEditorRowTemplate *template = [[NSPredicateEditorRowTemplate alloc] 
     initWithLeftExpressions:[NSArray arrayWithObject:nameExpression] 
     rightExpressionAttributeType:NSStringAttributeType 
     modifier:NSDirectPredicateModifier 
     operators:operators 
     options:options]; 
+0

阿希利,謝謝你的詳細澄清。 – Carmen 2010-01-28 02:55:20

1

這可能是LIKE運算符的問題。此代碼記錄沒有警告:

NSPredicate *p; 
p = [NSPredicate predicateWithFormat:@"name == 'John'"]; 
[ibPredicateEditor setObjectValue:p]; 

p = [NSPredicate predicateWithFormat:@"age > 18"]; 
[ibPredicateEditor setObjectValue:p]; 
+0

你是對的。正如上面的Ashely所述,自動生成的模板不支持LIKE運算符。 – Carmen 2010-01-28 02:29:22