2010-01-26 6 views
1

Я пытаюсь создать шаблоны редактора предикатов для объектов Core Data. В моем коде у меня есть следующий: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] {типа = неизменному, COUNT = 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]; 

ИЛИ

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 поддерживает:

- Равно
- Не равно
- Начинается с
- Концы С
- Содержит

(найденный в NSComparisonPredicate.h)

СОДЕРЖИТ похож на 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]; 
+0

Эшли, спасибо за подробное разъяснение. – Carmen

1

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

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

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

Вы верны. Как указано выше в Ashely, шаблоны, которые генерируются автоматически, не поддерживают оператор LIKE. – Carmen