2

私が作成したアプリケーションは、以前は完全に正常に機能していました。すべてのデータを暗号化する必要があるという新しい要件があるため、すべてのコア データ フィールドの型を変換可能にし、データ型ごとにデータの各要素を暗号化/復号化するカスタム トランスフォーマーを記述して暗号化を実装しました。コア データ ストア。

暗号化は正常に機能し、すべてのデータを確認できます。問題は、少し複雑な述語 (サブクエリを含むもの) と同様に、並べ替えが壊れているように見えることです。

値がトランスフォーマーを介して送信される前に、値に対して並べ替えが行われていると思います (つまり、暗号化された値に対して並べ替えが行われています)。これを回避する方法はありますか?ソート記述子を使用して、独自のセレクターを指定して比較を行い、最初に値を明示的に復号化できると思います。それが機能する場合は、ここに投稿します。

ただし、述語の状況はより大きな問題です。ほとんどが機能しているように見えますが、サブクエリを実行すると失敗するのは奇妙です (これは、関係にある 2 つのオブジェクト間の結合のようなものです)。変換可能な値と述語を使用する際に既知の問題はありますか、それとも変換プログラムにバグがあるのでしょうか?

機能しなくなった述語の例を次に示します。

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

述語は、AppuserMessages と 1 対多の関係を持つ Messages オブジェクトに対して実行されます。この述語は、isdeleted ではなく、recAppUserID が appuserid で isTrash が false である appuserMessage が少なくとも 1 つあるすべてのメッセージを返すことになっています。以前は機能していましたが、現在は何も返されません。

4

1 に答える 1

1

より多くの実験から、変換可能なデータ型がある場合、サブクエリは機能しないようです。

ソート記述子も機能しません。その理由は理解できます。並べ替えはデータベース エンジンに委任されたままになるため、並べ替えは変換前の行で行われます。私の場合、それは、復号化された値ではなく、(ランダムな) 暗号化された値に基づいてソートされることを意味します。

唯一の解決策は、行を変更可能な配列にフェッチしてから、配列でソートを実行することです (sortWithDescriptors を使用)。

サブクエリに関しては、同様の問題だと思います。おそらく、サブクエリはデータベース エンジンの事前変換によって実行されるため、常に失敗します。繰り返しになりますが、解決策は、結果の変更可能な配列に対するフィルターを使用して、フェッチで可能な限り複雑なクエリを実行し、残りのクエリ (サブクエリ部分) を実行することです。

于 2010-10-08T01:26:26.960 に答える