【问题标题】:Coredata fetch with NSSortDescriptor by alphabetically and length of property使用 NSSortDescriptor 按字母顺序和属性长度获取核心数据
【发布时间】:2018-01-09 08:43:57
【问题描述】:

在 myCoredata 实体(Persons)中,我想获取所有 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 做这样的事情?

【问题讨论】:

    标签: core-data xcode8 nsfetchrequest nssortdescriptor


    【解决方案1】:

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

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

    此外,您可能不想使用 NSString.length,因为它可能并不意味着您认为它的含义。带有装饰标记的字母(如“ressumé”)的长度可能比您预期的要长。表情符号也可以是 2 或 4 或 8 个长度的字符串。相反,您可以使用 enumerateSubstringsInRange:options:usingBlock:

    计算组合字符序列

    【讨论】:

      【解决方案2】:

      一种方法是向核心数据实体的子类中添加一个带有自定义 getter 的属性。如果您需要处理大量核心数据,我建议您使用类似 mogenerator 或用于处理实体生成的内置函数,这样您就不会在每次更改模型时都过度编写模型类。

      @property (nonatomic, readonly, getter=getFirstNameLength) NSUInteger firstNameLength;
      
      -(NSUInteger)getFirstNameLength {
         return [firstName length];
      }
      

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

      【讨论】:

      • 我尝试了这段代码,但我只能使用NSInMemoryStoreType。当我用SQLLiteStoreType 尝试它时,我得到了一个异常:'NSInvalidArgumentException',原因:'keypath firstNameLength not found in entity。你有没有以某种方式完成这项工作?可以分享一下代码吗?
      • 有趣,我没有使用确切的代码,但我会看看。
      • 我为滚动索引使用了自定义属性。在表格视图中。我注意到我在计算代码周围添加了带有 self willAccessValueForKey 和 didAccessValueForKey 的 KVO 代码。我很困惑为什么你的代码不能作为 sql 存储。
      • 您可以为滚动索引和 sectionKeyPath 使用自定义属性,因为它们是在获取后在内存中计算的。您不能将它们用于谓词或排序描述符,因为它们是在 SQL 级别上运行的。
      • 感谢您指出这一点。以为我有一个解决方案对不起:-(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多