NSPredicateEditorRowTemplate和CoreData

时间:2010-01-26 14:20:17

标签: cocoa core-data nspredicateeditor nspredicateeditorrow

我正在尝试为我的核心数据实体生成谓词编辑器模板。在我的代码中,我有以下内容:

 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]   {type = immutable,count = 2,values =   (                  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];

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

这两个产生的警告与我最初的问题相似。但是,我觉得很奇怪,我可以使用单个谓词并构建一个复合和谓词,但我无法将预构建的复合和谓词传递给编辑器。

2 个答案:

答案 0 :(得分:2)

NSPredicateEditorRowTemplateNSString密钥路径提供的默认模板不支持与LIKE运算符进行比较。

在您生成的模板中,有一个它支持的运算符列表:

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

[99, 4, 5, 8, 9]表示名称NSString属性支持:

4 - 等于
5 - 不等于
8 - 开始与
9 - 结束与 99 - 包含

(在NSComparisonPredicate.h中找到)

CONTAINS类似于没有%和_替换的LIKE。如果您需要,您可以随时初始化自己的模板阵列。

语法有点详细。

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];

答案 1 :(得分:1)

LIKE运算符可能存在问题。此代码不会记录警告:

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

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