【问题标题】:Sort CoreData NSFetchRequest exact matches first首先对 CoreData NSFetchRequest 完全匹配进行排序
【发布时间】:2016-02-02 11:05:44
【问题描述】:

我正在通过带有 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 中的结果复制到一个可变数组中并在代码中排序,但如果可能的话,我想避免这种情况。

那么有什么办法可以存档吗?也许是数据模型或谓词技巧中的一些巧妙更改?

【问题讨论】:

  • 我认为按长度排序应该可行。类似"word.length"
  • 好的,那么当你尝试这样做时发生了什么?
  • 它不是那样工作的。我稍后会调查,也许这只是语法。最坏的情况是我必须创建一个存储长度的列。
  • 好的,所以它确实适用于我的情况。精确匹配是第一位的。我将汇总我自己的问题的答案。

标签: core-data nsfetchrequest


【解决方案1】:

我已经找到了一种方法来做到这一点。我在这里找到了提示:https://stackoverflow.com/a/31316010/921573

诀窍是按长度排序。精确匹配必然具有最小的长度值。
所以我的排序描述符看起来像这样:

NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"word.length"
                                                     ascending:YES];

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 2020-03-27
    • 2023-04-09
    • 1970-01-01
    • 2016-05-20
    • 2014-08-23
    • 2021-07-21
    • 2013-02-10
    • 2018-10-04
    相关资源
    最近更新 更多