NSFetchedResultsController不排序上的加密属性(NSFetchedResul

2019-09-24 00:07发布

我试图用变形型加密在我的核心数据模型的属性,但我遇到了很多的努力,一旦数据被保存到sqlite的分贝来获取返回结果的问题。 我给核心数据主要应用是存储一些用户相关的数据,并获取其背面通过第一名字,姓氏等再次进行排序,然后使用名/姓的首字母为节头在表视图显示它。 看来,加密与结果的干扰,因为我什么也没有回来时,我尝试做取使用姓氏作为一种描述NSFetchedResultsController请求。 我得到以下错误:

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排序变压器解密后的数据? 或者是有办法也许找回原始数据,然后进行排序之后我在NSFetchedResultsController实例的数据?

我用此源来加密核心数据属性:

Answer 1:

还有就是在“核心数据编程指南”一些相关的信息。

  • 获取管理对象 :

你不能提取使用基于瞬态特性谓词(虽然你可以使用瞬态特性在记录自己进行筛选)。 ......总之,不过,如果你执行一个直接获取数据,通常不应添加目标为基础的C-谓词或排序描述符的获取请求。 相反,你应该运用这些的获取结果。

  • 取谓词和排序描述符 :

有获取和存储的类型之间的一些互动。 ...在SQL店,在另一方面,编译谓词和排序描述符SQL和评估结果在数据库本身。 这主要是做了性能,但它意味着,评估发生在非可可的环境,所以那种依靠可可不能工作描述(或谓词)。

由于变压器被从商店的SQLite提取它,使用一个变换属性作为排序键不会产生所期望的结果之后施加到该数据。

你的核心数据错误可能是由以下事实导致的部分使用的是加密的数据进行排序,但sectionNameKeyPath的FRC(可以是一过性的属性)给出了未加密的数据,这当然是不一致的。

我可以想像,唯一的办法是存储有足够的信息可以作为排序关键字(例如人的首字母)的附加属性加密。



Answer 2:

据我所知,NSFetchRequest的(当你使用通过CoreData SQLite的)生成SQL,用它在SQLite和返回结果。 所以,虽然sqlite的一无所知您解密由CoreData做,就不可能进行排序使用解密的数据NSFetchRequest结果。

可能的解决方案是那种在你的加密字段手动复制到NSFetchRequest的NSArray的结果做。 另一种方案是在每次插入或修改您的数据进行排序,并写入以特定的整数字段,然后同时取排序在这个领域(它将如果你插入和修改比取那么频繁保存演奏)。



Answer 3:

您所描述的错误发生,因为排序发生在数据库中的加密数据,但NSFetchedResultsController后期的作品在未加密的数据,并抱怨因为数据未对部分名称正确排序。

排序分贝内,你就必须提供足够的加密信息进行排序,并保持这些信息跟上时代的。

例如,对于由第一名称排序,你可以存储未加密的属性firstNameSection其中包含的第一个字母firstName和属性firstNameSortInfo其中包含名称的位置为每个索引(例如,“亚伦” = 0,“阿比“= 1,等

然后你可以使用firstNameSectionfirstNameSortInfo进行排序,并firstNameSectionsectionNameKeyPath 。 这种方法有(至少)两个缺点:

  1. 你将不得不在保持firstNameSortInfo跟上时代的,而这将需要更多的写入速度比你可能会喜欢,和firstNameSortInfo排序会在内存中做(因为它是在未加密的数据进行)。
  2. 关于加密的数据的一些信息可以是已知的一个潜在的攻击者,这可能削弱加密。


文章来源: NSFetchedResultsController not sorting on encrypted attributes