0

假设我在核心数据中有一个实体“Person”。 现在我想搜索所有人。无论是firstname开始匹配还是lastname开始匹配。 对于例如: 1)阿米特古普塔 2)的Ajay古拉蒂 3)Gunjan AGGARWALNSFetchRequest以特定顺序显示结果

搜索'谷将会显示匹配姓名第一名称,则这些匹配因此LASTNAME 结果是:

Gunjan Aggarwal Ajay Gulati Amit Gupta

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

很大

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

任何人都可以帮忙吗?

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

我希望与'姓氏'匹配的结果比'姓氏'匹配的结果要早。

如果你使用排序描述符,你会提到哪个'Key'或'attribute'?

+1

我不清楚地明白,为什么你不能使用NSSortDescriptor(其意在这个用例)? – Vinzzz

+0

编辑我的问题... –

+0

@YatinSarbalia没有多少属性,'NSSortDescriptor'工作正常。 ) – Kjuly

回答

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:方法将此您的搜索结果排列。没有测试代码可用,但我想你可以自己弄清楚。 ;)

+0

不正确。请再次阅读我的问题 –

+0

@YatinSarbalia我看到..但你可以发现'setSortDescriptors:'使用一个数组,所以只需将两个描述符放入数组中。查看新版本的答案。 :) – Kjuly

+0

让我们的例子: 1)AB 2)AC 3)BD 4)BG 5)EB 6)EF 我搜索 'B' 期望的结果是:(结果相匹配第一那名至上) 1)BD 2)BG 3)AB 4)EB 而如果我使用两种类型的描述符如你所说,其结果必然是: 1)AB 2)BD 3)BG 4)EB –

1

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

2

在您的核心数据对象中使用瞬态属性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; 
}