5

私はインターネット全体でこの答えを探してきましたが、今のところ運がありません。だから私はここで賢くて素敵な人々に相談する必要があります。ここで質問するのは初めてなので、質問を繰り返さずに、これを正しく行っていることを願っています。

私が見たすべての例では、コアデータに格納されているもののサブ文字列であるのは検索文字列です。一方、私は次のことを達成したいと思います。

コアデータに格納されている文字列は、実際にはサブ文字列です。提供された検索文字列に属するサブ文字列を持つすべてのコアデータ行を取得して検索を実行したいと思います。

例:コアデータには「AB」、「BC」、「ABC」、「ABCDEF」、「GH」、「ABA」があり、アプリではスーパーストリング「ABCDEF」を指定して検索します。 、結果は「AB」、「BC」、「ABC」、「ABCDEF」を返しますが、「GH」、「ABA」は返しません。これら2つのサブストリングはスーパーストリングに属していないためです。

predicateWithFormatステートメントをどのように設定する必要がありますか?

これは逆のことをしているのでうまくいきません:

NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"substring LIKE[c] %@", @"ABCDEF"];

皆さんありがとう!

4

2 に答える 2

4

の逆は機能しCONTAINSません。LIKEまた、検索している属性を取得してワイルドカード文字列に変換する必要があるため、使用できなくなります。

MATCHES正規表現を使用できるので、使用する方法があります。*まず、各文字の後に接辞を付けて、検索文字列を正規表現に変換します。次に、述語を形成します。

このソリューションは、あなたの例で動作するようにテストされています。

NSString *string= @"ABCDEF";
NSMutableString *new = [NSMutableString string];
for (int i=0; i<string.length; i++) {
    [new appendFormat:@"%c*", [string characterAtIndex:i]]; 
}
// new is now @"A*B*C*D*E*F*";
fetchRequest.predicate = [NSPredicate predicateWithFormat:
                          @"stringAttribute matches %@", new];

ここstringAttributeで、述語は、NSString管理対象オブジェクトの属性の名前です。

于 2012-06-08T08:34:47.887 に答える
0

私はこれがうまくいくと思います:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%@ contains self",@"ABCDEF"];

コアデータでは次のように使用します。

-(IBAction)doFetch:(id)sender {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    request.entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext];
    request.predicate = [NSPredicate predicateWithFormat:@"%@ contains desc",@"ABCDEF"];
    NSArray *answer = [self.managedObjectContext executeFetchRequest:request error:nil];
    NSLog(@"%@",answer);
}

この例では、「desc」はエンティティ「Expense」の属性です。これにより、「desc」が「ABCDEF」のサブストリングである行のみが正しく取得されます。

于 2012-06-08T01:11:27.467 に答える