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等
然后,您可以使用firstNameSection
和firstNameSortInfo
进行sorting,并将firstNameSection
用作sectionNameKeyPath
。 这种方法(至less)有两个缺点:
- 你将不得不保持
firstNameSortInfo
是最新的,这将需要更多的写入,你可能会喜欢,firstNameSortInfo
sorting将不得不在内存中完成(因为它是在未encryption的数据上完成)。 - 一些有关encryption数据的信息可能被潜在的攻击者知道,这可能削弱encryption。
- com.apple.product-type.bundle.ui-testing,但是'iphonesimulator'平台没有这样的产品types
- iOS:使用CLGeocoder与ReverseGeocoding进行比较 Google Geocoder API
- 获取时,托pipe对象具有不同的ID
- 核心数据deleteObject:不工作?
- 嵌套子查询无法编译的NSPredicate(核心数据)
- MagicalRecords从JSON / NSDictionary导入数据。 导入关系
- 用Swift 3.0parsingJSON数组到Server
- 如何在NSPredicate中使用“ALL”聚合操作来过滤基于CoreData的集合
- + entityForName:nil不是合法的NSManagedObjectContext参数search实体名称“帐户”
- 如何使用predicateWithFormat进行查询NSString包含在NSSet中
- Restkit编辑插入coredata