NSFetchRequest以特定顺序显示结果
假设我在核心数据中有一个实体“Person”。 现在我想搜索所有人。 无论是firstname开始匹配还是lastname开始匹配。 例如:1)Amit Gupta 2)Ajay Gulati 3)Gunjan Aggarwal
搜索'Gu'会显示与firstname匹配的名称,然后匹配lastname的名称会导致:
Gunjan Aggarwal Ajay Gulati Amit Gupta
一个选项:获取所有对象,将它们存储在数组中然后进行排序。 但是,如果搜索结果数量非常大,会发生什么
第二个选项:使用NSFetchedResultsController这将获取所有匹配但不是所需的方式(名字前的名字)。 无法使用排序描述符,因为它不在任何键上排序,而是在匹配时排序。
任何人都可以帮忙吗?
编辑:名字和姓氏是'Person'实体的两个不同属性。 名字匹配或姓氏匹配。
我希望与'姓氏'匹配的结果比'姓氏'匹配的结果要早。
如果你使用排序描述符,你会提到哪个'Key'或'attribute'?
尝试在获取之前设置排序描述符 :
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:
方法的搜索结果数组中。 没有测试代码可用,但我想你可以自己弄清楚。 ;)
在核心数据对象中使用瞬态属性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;
}
使用两个提取请求。 当您向视图提供数据时,显示第一个获取请求的结果,然后显示第二个结果。
链接地址: http://www.djcxy.com/p/36131.html