NSPredicateEditorRowTemplate и CoreData - PullRequest
       28

NSPredicateEditorRowTemplate и CoreData

1 голос
/ 26 января 2010

Я пытаюсь сгенерировать шаблоны редактора предикатов для моих сущностей базовых данных. В моем коде у меня есть следующее:

 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"

Интерфейс для этого выглядит предельно простым, поэтому я не могу понять, что я делаю неправильно. Любая помощь будет принята с благодарностью!

EDIT

Моя первоначальная проблема заключалась в том, что я использовал оператор 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 ]

2 голосов
/ 27 января 2010

Шаблоны по умолчанию, предоставляемые NSPredicateEditorRowTemplate для NSString путей клавиш, не поддерживают сравнения с оператором LIKE.

В сгенерированных вами шаблонах есть список поддерживаемых операторов:

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

[99, 4, 5, 8, 9] указывает, что атрибут name 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 голос
/ 26 января 2010

Это может быть проблема с оператором LIKE. Этот код не регистрирует предупреждение:

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

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