如何在核心数据可转换字段中使用排序描述符和谓词?

时间:2010-10-03 21:41:42

标签: iphone core-data nspredicate nssortdescriptor transformer

我有一个我写的应用程序,它曾经很好地工作。现在需要对所有数据进行加密有新的要求,因此我通过使所有核心数据字段都可以转换并为每种数据类型编写自定义转换器来实现加密,这些数据类型在从数据类型写入/读取时加密/解密每个数据元素。核心数据存储。

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

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

谓词情况虽然是一个更大的问题。奇怪的是,它似乎主要工作但是当我做子查询时失败(这就像在一个关系中跨两个对象的连接)。使用可变换值和谓词时是否存在已知问题,或者我的变换器中有错误?

以下是不再有效的谓词示例:

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

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

1 个答案:

答案 0 :(得分:1)

从更多的实验来看,当你有可转换的数据类型时,subquerys似乎根本行不通。

排序描述符也不起作用,这是可以理解的原因。将排序委托给数据库引擎来完成,因此对预转换的行进行排序。就我而言,这意味着它们是根据它们的(随机)加密值而不是解密的值进行排序的。

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

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