1

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

 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: [name] [99, 4, 5, 8, 9] NSStringAttributeType 1: NSPredicateEditorRowTemplate 0x1002,52dc0: [年龄] [4, 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];

这两个都会产生与我最初的问题类似的警告。但是,我觉得奇怪的是,我可以使用单个谓词并构建复合和谓词,但我不能将预构建的复合和谓词传递到编辑器中。

4

2 回答 2

3

NSPredicateEditorRowTemplate为key-paths提供的默认模板NSString不支持与 LIKE 运算符进行比较。

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

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

[99, 4, 5, 8, 9]表示 nameNSString属性支持:

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];
于 2010-01-27T09:26:12.303 回答
1

这可能是 LIKE 运算符的问题。此代码不记录任何警告:

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

p = [NSPredicate predicateWithFormat:@"age > 18"];
[ibPredicateEditor setObjectValue:p];
于 2010-01-26T20:31:02.197 回答