假设核心数据中有一个实体“人物”。 现在我想搜索所有人。 firstname开始匹配或lastname开始匹配。 例如: 1)阿米特古普塔 2)Ajay Gulati 3)Gunjan Aggarwal
搜索“Gu”会显示与firstname匹配的名称,然后显示与lastname匹配的名称 因此结果是:
Gunjan Aggarwal Ajay Gulati 阿米特古普塔
一个选项:获取所有对象,将它们存储在数组中然后排序。 但是,如果搜索结果数量非常大
,该怎么办?第二个选项:使用NSFetchedResultsController 这将获取所有匹配但不是以所需方式(lastname之前的名字)。 不能使用排序描述符,因为它不是在任何键上排序,而是在匹配时。
有人可以帮忙吗?
编辑: 名字和姓氏是“人”实体的两个不同属性。 姓名匹配或姓氏匹配。
我想要的结果是'Firstname'匹配,而不是带有'Lastname'匹配的结果。
如果你使用排序描述符,你会提到“密钥”或“属性”???
答案 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
,使其与firstName
和lastName
属性进行比较,然后按字母顺序返回最先出的属性。
现在只需将此属性用作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)
使用两个获取请求。当您向视图提供数据时,显示第一个获取请求的结果,然后显示第二个获取结果的结果。