4

NSPredicateいくつかのCoreDataオブジェクトの検索に使用する必要があります。ただし、カスタムオブジェクトのキーnameには、数字と文字の両方を含めることができます。文字列は次のようになります:John 1234 LennonまたはRingo Starr。私は通常、述語を使用しますNSPredicate *predicate = [NSPredicate predicateWithFormat:@"Any name CONTAINS[cd] %@",searchString];

ただし、述語を検索しても何も返されません。これは、が欠落しているためJohn Lennon、文字が含まれているかどうかを比較できないためです。どのような述語を使用できるかについてのヒントはありますか?John Lennon1234

4

3 に答える 3

12

クエリをトークン化することができます。

NSArray *tokens = [querystring componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

次に、複合述語を作成します。

NSMutableArray *predarray = [NSMutableArray array];

for(NSString *token in tokens)
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Any name CONTAINS[cd] %@",token];
    [predarray addObject:predicate];
}

NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:predarray];

そしてそれをあなたのクエリに送ります

実際には、各トークンに対して少し検証を実行して、有効な述語を作成し、クラッシュしたりセキュリティリスクを引き起こしたりしないことを確認します。例:「*[]」のような特殊文字を削除する

編集:質問の状況で機能するように述語タイプを修正しました。

于 2012-10-15T16:09:43.683 に答える
0

containsの代わりにLIKEを使用してみてください。そうすれば、ワイルドカードを使用できます。たとえば、John * Lennonは、Johnで始まり、Lennonで終わる文字列に、他の任意の数の文字を入れて一致させる必要があります。使用できますか?代わりに、一致するものをより細かく制御したい場合は、疑問符ごとに1つの文字のみに一致します。

于 2012-10-15T18:25:59.480 に答える
0

検索文字列を文字列の配列に分割してから、述語を切り替えて、名前内の任意の文字列を検索できます。

NSArray *strings = [searchString componentsSeparatedByString:@" "];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY %@ IN name",strings];
于 2012-10-15T19:48:06.010 に答える