3

変換可能な型を使用して Core Data モデルの属性を暗号化しようとしていますが、データが sqlite db に永続化された後に結果を取得しようとすると、多くの問題が発生します。私の Core Data の主な用途は、いくつかのユーザー関連データを保存し、名前、姓などで並べ替えて再度フェッチし、姓/名の最初の文字をセクション ヘッダーとして使用してテーブル ビューに表示することです。lastName をソート記述子として使用して 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'

この問題の調査に多くの時間を費やしましたが、役に立ちませんでした。問題の内容と回避方法を知っている人はいますか? トランスフォーマーがデータを復号化した後に、データベースでソートを行う方法はおそらくありますか? または、生データを取得して、NSFetchedResultsController のインスタンスにデータを取得した後に並べ替える方法はありますか?

このソースを使用して、コア データ属性を暗号化しました。

4

3 に答える 3

1

あなたが説明したエラーは、データベース内の暗号化されたデータで並べ替えが行われるために発生しますが、NSFetchedResultsController後で暗号化されていないデータで機能し、データがセクション名に対して正しく並べ替えられていないために文句を言います。

データベース内でソートするには、ソートするのに十分な暗号化されていない情報を提供し、その情報を最新の状態に保つ必要があります。

たとえば、名前で並べ替えるにfirstNameSectionは、 の最初の文字を含む暗号化されていない属性と、各インデックスのその名前の位置を含むfirstName属性firstNameSortInfo(たとえば、"Aaron"=0、"Abby"=1)を格納できます。など

次に、ソートに and を、firstNameSectionasとして使用できます。このアプローチには、(少なくとも) 2 つの欠点があります。firstNameSortInfofirstNameSectionsectionNameKeyPath

  1. 最新の状態に保つfirstNameSortInfo必要があり、これには必要以上の書き込みが必要になり、firstNameSortInfo並べ替えはメモリ内で行う必要があります (暗号化されていないデータに対して行われるため)。
  2. 暗号化されたデータに関する一部の情報は、潜在的な攻撃者に知られてしまう可能性があり、暗号化が弱まる可能性があります。
于 2012-10-19T22:06:23.170 に答える
1

私の知る限りでは、NSFetchRequest (CoreData 経由で sqlite を使用する場合) は sql を生成し、それを sqlite で使用して結果を返します。そのため、sqlite は CoreData によって行われた復号化について何も知りませんが、復号化されたデータを使用して NSFetchRequest で結果をソートすることは不可能です。

考えられる解決策は、NSFetchRequest の結果を NSArray にコピーし、暗号化されたフィールドを手動でソートすることです。別の解決策は、すべての挿入または変更でデータをソートし、順序を特定の整数フィールドに書き込み、フェッチ中にこのフィールドをソートすることです (フェッチよりも挿入と変更の頻度が低い場合、パフォーマンスが節約されます)。

于 2012-10-20T19:20:35.860 に答える
1

「Core Data Programming Guide」に関連情報がいくつかあります。

一時的なプロパティに基づく述語を使用してフェッチすることはできません (ただし、一時的なプロパティを使用して自分でメモリ内をフィルター処理することはできます)。... 要約すると、ただし、フェッチを直接実行する場合は、通常、Objective-C ベースの述語またはソート記述子をフェッチ要求に追加しないでください。代わりに、これらをフェッチの結果に適用する必要があります。

フェッチとストアのタイプの間には、いくつかの相互作用があります。... 一方、SQL ストアは述語とソート記述子を SQL にコンパイルし、データベース自体で結果を評価します。これは主にパフォーマンスのために行われますが、評価が非 Cocoa 環境で行われることを意味するため、Cocoa に依存するソート記述子 (または述語) は機能しません。

トランスフォーマーはSQLite ストアからデータをフェッチしたにデータに適用されるため、変換された属性をソート キーとして使用しても、目的の結果が得られません。

Core Data エラーは、暗号化されたデータを使用してセクションがソートされていることが原因でsectionNameKeyPathある可能性がありますが、FRC (一時的な属性である可能性があります) は暗号化されていないデータを提供し、もちろん矛盾しています。

私が想像できる唯一の解決策は、ソートキーとして使用するのに十分な情報を持つ追加の暗号化されていない属性を保存することです (たとえば、人の頭文字)。

于 2012-10-16T18:40:28.097 に答える