使用NSSortDescriptor以字母顺序和属性长度获取Coredata

时间:2017-08-02 08:28:11

标签: core-data xcode8 nsfetchrequest nssortdescriptor

在myCoredata实体(Persons)中我想获取所有人,按字母顺序排列名称长度。我试过以下代码

NSSortDescriptor *nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"first_name" ascending:YES];
NSSortDescriptor *lengthSorter = [NSSortDescriptor sortDescriptorWithKey:@“first_name.length" ascending:YES];
[fetchRequest setSortDescriptors:@[lengthSorter, nameSortDescriptor]];

但没有运气。这是一种完全错误的方法吗?我怎么能用CoreData fetch做这样的事情?

2 个答案:

答案 0 :(得分:0)

你是对的,它不会起作用。用于fetchRequest的谓词将转换为mySQL查询,因此它们不接受所有有效谓词(例如predicateWithBlock)。

在这种情况下,我建议在client的表中添加另一列(实体中的属性)。只有一种方法可以设置名称并同时设置nameLength属性(因此它不会失去同步)。然后你可以简单地按照预先计算的nameLength属性进行排序。

此外,您可能不想使用NSString.length,因为它可能并不意味着您的意思。带有装饰标记的字母(如“简历”)可能会有更长的意图。表情符号也可以是2或4或8个长度的字符串。相反,您可以使用firstNameLength

计算合成的字符序列

答案 1 :(得分:0)

执行此操作的一种方法是将具有自定义getter的属性添加到核心数据实体的子类中。如果你做了很多核心数据,我建议使用mogenerator,或者用于处理实体生成的内置函数,这样每次更改模型时都不会过度编写模型类。

$ git checkout -b tempbranch c1
$ git cherry-pick <insert list of commits in the c1..c2 range you want>
... resolve any conflicts here if necessary ...
$ git diff c1 HEAD

只要此方法在.h类中是公共的,您就可以像在谓词中使用常规模型属性一样访问它。