NSFetchRequest以特定顺序显示结果

时间:2012-05-14 12:34:59

标签: iphone ios core-data nsfetchedresultscontroller nsfetchrequest

假设核心数据中有一个实体“人物”。 现在我想搜索所有人。 firstname开始匹配或lastname开始匹配。 例如: 1)阿米特古普塔 2)Ajay Gulati 3)Gu​​njan Aggarwal

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

Gunjan Aggarwal Ajay Gulati 阿米特古普塔

一个选项:获取所有对象,将它们存储在数组中然后排序。 但是,如果搜索结果数量非常大

,该怎么办?

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

有人可以帮忙吗?

编辑: 名字和姓氏是“人”实体的两个不同属性。 姓名匹配或姓氏匹配。

我想要的结果是'Firstname'匹配,而不是带有'Lastname'匹配的结果。

如果你使用排序描述符,你会提到“密钥”或“属性”???

3 个答案:

答案 0 :(得分: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:方法将其应用于搜索结果数组。没有可用的测试代码,但我认为你可以自己解决它。 ;)

答案 1 :(得分: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;
}

答案 2 :(得分:1)

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