2

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

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

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

于 2010-10-08T01:26:26.960 回答