11

CoreData に一連のユーザーがあり、アプリケーションに検索フィールドがあります。ユーザーにはプロパティ firstname と name があります。

現在、「user.name CONTAINS[c] %@ OR user.firstname CONTAINS[c] %@」のような述語があります。

これは、ユーザーが「john smith」のようなフルネームを入力するまで機能します。彼が「john sm」と入力しても、John Smith-Object が見つかるはずです。

検索語の配列 (IN) と CONTAINS を組み合わせる述語は何ですか?

4

4 に答える 4

38

述語で「IN」と「CONTAINS」を組み合わせることはできないと思います。ただし、検索文字列を単語に分割して、「複合述語」を作成することもできます。

NSString *searchString = @"John  Sm ";
NSArray *words = [searchString componentsSeparatedByString:@" "];
NSMutableArray *predicateList = [NSMutableArray array];
for (NSString *word in words) {
    if ([word length] > 0) {
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"user.name CONTAINS[c] %@ OR user.firstname CONTAINS[c] %@", word, word];
        [predicateList addObject:pred];
    }
}
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicateList];
NSLog(@"%@", predicate);

この例は述語を生成します

(user.name CONTAINS[c] "John" OR user.firstname CONTAINS[c] "John") AND
(user.name CONTAINS[c] "Sm" OR user.firstname CONTAINS[c] "Sm")

これは "John Smith" には一致しますが、"John Miller" には一致しません。

于 2012-11-20T20:21:54.747 に答える
15

2.5 年後、Swift でもう少し複雑な例を使用して質問に答えることができます。

var predicateList = [NSPredicate]()

let words = filterText.componentsSeparatedByString(" ")

for word in words{

     if count(word)==0{
           continue
     }

     let firstNamePredicate = NSPredicate(format: "firstName contains[c] %@", word)
     let lastNamePredicate = NSPredicate(format: "lastName contains[c] %@", word)
     let departmentPredicate = NSPredicate(format: "department contains[c] %@", word)
     let jobTitlePredicate = NSPredicate(format: "jobTitle contains[c] %@", word)

     let orCompoundPredicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [firstNamePredicate, lastNamePredicate,departmentPredicate,jobTitlePredicate])

     predicateList.append(orCompoundPredicate)
}

request.predicate = NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates: predicateList)
于 2015-05-25T17:55:29.790 に答える
-1

私は同じ問題を抱えていて、次のように解決しました:

NSManagedObject クラス (ユーザー) に次のメソッドを追加し、2 つの値を 1 つの文字列にマージしました。

- (NSString *)name
{
    return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname];
}

次に、リストと照合するために必要なのは次の行だけです。これは、私の場合はユーザー オブジェクトを含む NSArray です。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchString];
NSArray *filteredUsers = [users filteredArrayUsingPredicate:predicate];
于 2012-11-28T19:32:33.597 に答える