NSFetchedResultsController不对encryption的属性进行sorting

我正在尝试使用可转换types对我的Core Data模型中的属性进行encryption,但是一旦数据被持久保存到sqlite数据库中,就会遇到很多试图读取结果的问题。 我的核心数据的主要应用程序是存储一些用户相关的数据,并重新取回它的名字,姓氏等sorting,然后显示在一个表视图使用首字母/姓氏作为部分标题。 看来,encryption干扰的结果,因为我什么也没有得到什么回来,当我尝试做NSFetchedResultsController使用lastName作为sorting描述符的获取请求。 我得到以下错误:

CoreData: error: (NSFetchedResultsController) The fetched object at index X has an out of order section name 'S. Objects must be sorted by section name' 

我花了很多时间来调查这个问题无济于事。 有谁知道这个问题可能是什么,以及如何解决这个问题? 在变压器解密数据之后,有没有办法在db上进行sorting呢? 或者,有没有办法可能找回原始数据,然后在NSFetchedResultsController的实例中有数据后进行sorting?

我使用这个来源来encryption核心数据属性:

核心数据编程指南中有一些相关的信息。

  • 获取托pipe对象 :

您不能使用基于瞬态属性的谓词来获取(尽pipe您可以使用瞬态属性来自己在内存中进行过滤)。 …总而言之,如果直接执行提取操作,通常不应该添加基于Objective-C的谓词或将描述符sorting到提取请求中。 相反,您应该将这些应用于获取的结果。

  • 提取谓词和sorting描述符 :

抓取和商店types之间有一些相互作用。 另一方面,SQL存储将谓词和sorting描述符编译为SQL,并在数据库本身中评估结果。 这主要是为了性能,但这意味着评估发生在非Cocoa环境中,所以依赖于Cocoa的sorting描述符(或谓词)无法工作。

由于转换器是从SQLite存储中获取数据应用到数据上的因此使用转换后的属性作为sorting关键字不会产生所需的结果。

您的核心数据错误可能是由于使用encryption数据对部分进行sorting而引起的,但是FRC的sectionNameKeyPath (可能是transient属性)会给出未encryption的数据,这当然是不一致的。

我能想象的唯一解决scheme是存储一个额外的未encryption属性,该属性具有足够的信息来用作sorting关键字(例如,该人的首字母)。

据我所知,NSFetchRequest(通过CoreData使用sqlite时)生成sql,在sqlite上使用它并返回结果。 所以,虽然sqlite对CoreData所做的解密一无所知,但使用解密数据对NSFetchRequest进行sorting是不可能的。

可能的解决scheme是将NSFetchRequest的结果复制到NSArray中,并手动对encryption字段进行sorting。 另一种解决scheme是在每次插入或修改时对数据进行sorting,然后将顺序写入特定的整数字段,然后在对该字段进行sorting时(如果插入和修改的次数less于读取次数,将会节省您的性能)。

你描述的错误发生是因为sorting发生在数据库中的encryption数据上,但是NSFetchedResultsController稍后在未encryption的数据上工作,并且抱怨,因为数据没有正确sorting为节名称。

要在数据库中进行sorting,您必须提供足够的未encryption信息进行sorting,并使信息保持最新。

例如,按名字sorting,可以存储包含firstNameSection的第一个字母的未encryption属性firstNameSection和包含每个索引的名称位置的属性firstNameSortInfo (例如“Aaron”= 0,“Abby “= 1等

然后,您可以使用firstNameSectionfirstNameSortInfo进行sorting,并将firstNameSection用作sectionNameKeyPath 。 这种方法(至less)有两个缺点:

  1. 你将不得不保持firstNameSortInfo是最新的,这将需要更多的写入,你可能会喜欢, firstNameSortInfosorting将不得不在内存中完成(因为它是在未encryption的数据上完成)。
  2. 一些有关encryption数据的信息可能被潜在的攻击者知道,这可能削弱encryption。