1

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演算子をサポートしていないときに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

NSPredicateEditorRowTemplatefor 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 に答える