0

コア データに 1 つのエンティティ「Person」があるとします。今、私はすべての人を検索したいと思います。名の先頭一致または姓の先頭一致のいずれか。例: 1) アミット・グプタ 2) アジャイ・グラティ 3) グンジャン・アガルワル

「Gu」を検索すると、最初に名に一致する名前が表示され、次に姓に一致する名前が表示されるため、結果は次のようになります。

Gunjan Aggarwal Ajay Gulati Amit Gupta

1 つのオプション: すべてのオブジェクトを取得し、それらを配列に格納してから並べ替えます。しかし、検索結果の数が非常に多い場合はどうでしょうか

2 番目のオプション : NSFetchedResultsController を使用します。これは、一致するものをすべて取得しますが、必要な方法 (姓の前に姓) では取得しません。キーでソートするのではなく、一致時にソートするため、ソート記述子を使用できません。

誰でも助けることができますか?

編集:名と姓は、「人」エンティティの2つの異なる属性です。Firstname の一致または Lastname の一致。

「姓」が一致する結果よりも前に「名」が一致する結果が必要です。

ソート記述子を使用する場合、どの「キー」または「属性」について言及しますか???

4

3 に答える 3

3

フェッチする前にソート記述子を設定してみてください。

NSSortDescriptor * firstNameDescriptor;
firstNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName"
                                                  ascending:YES
                                                   selector:@selector(localizedCaseInsensitiveCompare:)];
NSSortDescriptor * lastNameDescriptor;
lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName"
                                                 ascending:YES
                                                  selector:@selector(localizedCaseInsensitiveCompare:)];
[firstNameDescriptor release];
[lastNameDescriptor release];

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:firstNameDescriptor, lastNameDescriptor, nil]];

次に、目的の人を取得します。


ソートされた結果を取得した後、検索に一致させるために、次のように並べ替える必要がある場合があります。

- (NSComparisonResult)compare:(id)anotherOne {
  // if the first name matches the searching key word, return NSOrderedAscending;
  // else return [self.firstName localizedCaseInsensitiveCompare:anotherOne.firstName];
}

次に、メソッドを使用してこれを検索結果配列に適用しますsortedArrayUsingSelector:。テストコードはありませんが、自分で理解できると思います。;)

于 2012-05-14T12:40:40.573 に答える
2

sortNameCore Data オブジェクトで一時的なプロパティを使用し、firstNamelastNameプロパティを比較して、アルファベット順に最初に来る方を返すようにします。

このプロパティを使用するだけで、目的sortDescriptorの結果が得られるはずです。

このようなもの...

- (NSString *)sortName
{
    [self willAccessValueForKey:@"sortName"];

    NSString *string = nil;

    if ([self.firstName compare:self.lastName] == NSOrderedAscending) {
        string = self.firstName;
    } else {
        string = self.lasttName;
    }

    [self didAccessValueForKey:@"sortName"];

    return string;
}
于 2012-05-21T17:11:33.180 に答える
1

2 つのフェッチ リクエストを使用します。ビューにデータを提供するときは、最初のフェッチ リクエストの結果を表示し、続いて 2 番目の結果を表示します。

于 2012-05-16T23:25:53.273 に答える