0

假设我在核心数据中有一个实体“人”。现在我想搜索所有人。名字开头匹配或姓氏开头匹配。例如:1) Amit Gupta 2) Ajay Gulati 3) Gunjan Aggarwal

搜索“Gu”会首先显示与 firstname 匹配的名称,然后是与 lastname 匹配的名称,因此结果为:

Gunjan Aggarwal Ajay Gulati Amit Gupta

一种选择:获取所有对象,将它们存储在数组中,然后排序。但是如果搜索结果的数量很大怎么办

第二个选项:使用 NSFetchedResultsController 这将获取所有匹配但不是以所需方式(姓氏之前的名字)。不能使用排序描述符,因为它不是在任何键上排序,而是在匹配时排序。

有人可以帮忙吗?

编辑:名字和姓氏是“人”实体的两个不同属性。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

在 Core Data 对象中使用瞬态属性sortName,使其比较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

使用两个获取请求。当您向视图提供数据时,显示第一个获取请求的结果,然后显示第二个请求的结果。

于 2012-05-16T23:25:53.273 回答