我有一个我编写的应用程序,过去运行得很好。有一个新的要求,即现在必须对所有数据进行加密,因此我通过使我的所有核心数据字段类型都可转换并为每种数据类型编写自定义转换器来实现加密,从而在对数据的各个元素进行读写时对它们进行加密/解密。核心数据存储。

加密工作正常,我可以看到所有数据。问题在于排序似乎像任何甚至稍微复杂的谓词(包括子查询的谓词)一样被打乱了。

我猜想在通过转换器发送值之前对值进行了排序(即,对加密值进行了排序)。有办法解决这个问题吗?我想我可以尝试使用排序描述符并指定自己的选择器进行比较,并首先显式解密值。如果可以的话,我会在这里发布。

谓语情况是一个更大的问题。奇怪的是,它似乎大部分都可以工作,但是当我执行子查询时就失败了(子查询就像关系中两个对象的联接一样)。使用可转换的值和谓词时是否存在已知问题,或者我的转换器有错误?

这是一个不再起作用的谓词示例:

[NSPredicate predicateWithFormat:@"isdeleted == NO AND (SUBQUERY(appuserMessages, $am, $am.recAppUserID == %@ AND $am.isTrash == NO).@count > 0)", appuserid];


谓词在与AppuserMessages具有一对多关系的Messages对象上执行。该谓词应返回未删除且具有至少一个appuserMessage的所有消息,其中recAppUserID为appuserid且isTrash为false。它曾经可以工作,但是现在什么也不返回。

最佳答案

从更多的实验来看,当您拥有可转换的数据类型时,子查询似乎根本无法工作。

排序描述符也不起作用,这是可以理解的。排序由委派给数据库引擎来完成,因此排序是在预转换的行上完成的。在我的情况下,这意味着它们根据其(随机)加密值而不是解密值进行排序。

唯一的解决方案似乎是将行提取到可变数组中,然后对数组执行排序(使用sortWithDescriptors)。

至于子查询,我假设它是一个类似的问题。子查询可能由数据库引擎预转换完成,因此始终失败。同样,解决方案是在获取中尽可能复杂地执行查询,然后对查询的其余部分(子查询部分)使用可变结果数组上的过滤器。

关于iphone - 如何将排序描述符和谓词与核心数据可转换字段一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3851715/

10-13 07:12
查看更多