首先对 CoreData NSFetchRequest 完全匹配进行排序
Sort CoreData NSFetchRequest exact matches first
我正在通过具有 BEGINSWITH 谓词的属性搜索 CoreData 实体。现在我想按相关性对结果进行排序,以便首先出现直接匹配项。
示例搜索字符串:
"star"
结果列表:
"star" # <- exact match should be first
"starship"
"stargazer"
我有一个这样的 CoreData 获取请求:
NSString *stringFromSearchField;
NSFetchRequest *fr =[NSFetchRequest fetchRequestWithEntityName:@"SearchWord"];
fr.predicate = [NSPredicate predicateWithFormat:@"(word beginswith %@)", stringFromSearchField];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"Exact matches first, please..." ascending:YES];
fr.sortDescriptors = @[sortDescriptor];
我知道我可以将 NSFetchedResultsController 的结果复制到可变数组中并在代码中排序,但我想尽可能避免这种情况。
有什么办法可以存档吗?也许数据模型或谓词技巧有一些巧妙的改变?
我想出了一个方法来做到这一点。我在这里找到了提示:
诀窍是按长度排序。精确匹配必然有最小的长度值。
所以我的排序描述符看起来像这样:
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"word.length"
ascending:YES];
我正在通过具有 BEGINSWITH 谓词的属性搜索 CoreData 实体。现在我想按相关性对结果进行排序,以便首先出现直接匹配项。
示例搜索字符串:
"star"
结果列表:
"star" # <- exact match should be first
"starship"
"stargazer"
我有一个这样的 CoreData 获取请求:
NSString *stringFromSearchField;
NSFetchRequest *fr =[NSFetchRequest fetchRequestWithEntityName:@"SearchWord"];
fr.predicate = [NSPredicate predicateWithFormat:@"(word beginswith %@)", stringFromSearchField];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"Exact matches first, please..." ascending:YES];
fr.sortDescriptors = @[sortDescriptor];
我知道我可以将 NSFetchedResultsController 的结果复制到可变数组中并在代码中排序,但我想尽可能避免这种情况。
有什么办法可以存档吗?也许数据模型或谓词技巧有一些巧妙的改变?
我想出了一个方法来做到这一点。我在这里找到了提示:
诀窍是按长度排序。精确匹配必然有最小的长度值。
所以我的排序描述符看起来像这样:
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"word.length"
ascending:YES];