8

翻訳されたソートキーと sectionKeyPath で NSFetchedResultsController を使用するにはどうすればよいですか?

問題: typeA、typeB、typeC などのデータベースのプロパティ「type」に ID がありますが、ローカライズする必要があるため、直接値ではありません。英語では typeA=Bird、typeB=Cat、typeC=Dog ドイツ語では Vogel、Katze、Hund となります。

「タイプ」にソートキーとsectionKeyPathを持つNSFetchedResultControllerを使用すると、注文とセクションを受け取ります-typeA-typeB-typeC

次に表示用に翻訳すると、すべて英語で問題ありません: - 鳥 - 猫 - 犬

ドイツ語に切り替えると、間違った並べ替え順序が表示されます - Vogel - Katze - Hund

まだtypeA、typeB、typeCでソートされているため

そこで、NSFetchedResultsController の並べ替えをローカライズする方法を探しています。

一時的なプロパティ アプローチを試しましたが、ソート キーはエンティティ内にある必要があるため、ソート キーでは機能しません。

他に思いつきません。しかし、ローカリゼーションに必要な派生属性で NSFetchedResultsController を使用できないとは信じられませんか?

NSFetchedResultsController でカスタム セクションを使用するなどの関連する議論がありますか? ただし、カスタム セクション名とソート キーの順序がおそらく同じであるという違いがあります。私の場合ではなく、これが主な違いです。

最後に、派生属性で必要な NSSortDescriptor の並べ替え順序が必要になると思います。このソート順は、sectionKeyPath にも使用する必要があります。

ヒントをありがとう。

4

3 に答える 3

3

OK、良い解決策ではありませんが、最終的には機能しています (定義された制限付きのレコードセット約 100 があるため):

アプリの初期化時:

  • 管理対象オブジェクトに「order by」属性を作成します。
    • 前回からローカリゼーション (および並べ替え順序) が変更されたかどうかを確認します。もしそうなら:
    • すべてのレコードを取得し、ローカライズされた名前で NSArray に並べ替えます。
    • 店の記録を書き戻す

パフォーマンス上の理由から、NSPredicate に従ってレコードのみをフェッチしてソートします。

「order by」をソートキーとセクションキーパスとして使用して、既存のすべてのコードを使用できます。

順序付けられた配列をテーブル ビューのデータソースとして使用できることはわかっていますが、既存のコードを保持し、NSFetchedResultsController のメソッドを使用したいと考えていました。

これの便利さとして、ソートを完全に制御できます。これは、より複雑なソート順序を構築する予定であるため、将来的には私のニーズに適合します (場所に基づく、上部のレコードの使用確率が高いなど)。

ただし、それはエレガントなソリューションではありません。

于 2010-05-05T06:04:09.740 に答える
0

問題はキャッシュが原因だと思います。

次のメソッドを使用してNSFetchedResultsControllerオブジェクトを作成するときに、指定された名前でキャッシュを設定できます。最後の変数はキャッシュ名です。

- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)context sectionNameKeyPath:(NSString *)sectionNameKeyPath cacheName:(NSString *)name

NSFetchedResultsControllerは、キャッシュを使用してセクションを計算し、同じ名前のキャッシュが存在する場合は順序を計算します。そして、キャッシュは(メモリではなく)ディスクに書き込まれます。

したがって、言語を英語とドイツ語の間で変更する場合は、キャッシュを削除する必要があります。キャッシュを削除するには、クラスメソッドを使用できますdeleteCacheWithName:

詳細情報はここにあります。 http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008227-CH1-SW24

于 2010-04-30T15:07:09.570 に答える
0

最後に、派生属性で必要なNSSortDescriptorの並べ替え順序が必要になると思います。

並べ替えの場合、1つの可能性は次のようなことです。

[NSSortDescriptor initWithKey:@"type" 
 ascending:YES 
 selector:@selector(translatedCompare:)]

ここで、translatedCompareは、値を比較する前に値をローカライズする(NSStringのカテゴリとして)作成する比較メソッドです。

sectionKeyPathの処理方法がわからない。

于 2010-04-30T12:44:53.930 に答える