2

次のコードがあります。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like[c] %@", projectName];
[fetchRequest setPredicate:predicate];
[moc executeFetchRequest:request error:error]; // moc & error are defined elsewhere

projectName を「asdf」にしてこのコードを実行すると、すべてうまくいきます。ただし、値が「asdf\」に設定されている場合 (末尾のバックスラッシュに注意してください)、次の例外が表示されます。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The backslash is a wildcard char, and cannot appear unescaped at the end of a string.'

po リクエストにより、次の情報が得られます。

po request
<NSFetchRequest: 0x101348ee0> (entity: Project; predicate: (name LIKE[c] "asdf\\"); sortDescriptors: ((null)); type: NSManagedObjectResultType; )

これは単純な問題のように思えますが、インターネット上で解決策を見つけることができません。

4

1 に答える 1

5

LIKE述語ハンドル内*およびワイルドカード文字?として、1 文字に一致し、0 個以上の文字に一致します。これらのワイルドカード文字は、アスタリスクまたは疑問符を逐語的にエスケープするか、一致させることができます。?*\*\?

結果として、\\単一のバックスラッシュに一致するように、「LIKE」クエリのようにバックスラッシュ自体をエスケープする必要があります。検索パターンの最後にある単一のバックスラッシュはエラーを引き起こします (それがあなたのケースで起こったことです)。

ワイルドカード処理が必要ない場合は、代わりに==,BEGINSWITHまたはを使用できます。CONTAINSこれらはすべて と組み合わせることができます[c]

于 2013-10-05T13:28:51.020 に答える