2011-10-28 8 views
0

私はモデルオブジェクトをロードするカスタムビューを持っています(Personとしましょう)。これらのオブジェクトは、Loaderによって得られたDBに格納され、前記ビューをインスタンス化するCursorAdapterを介してListViewに挿入されます。ここまでは順調ですね。Android:SQLite、UI、キャッシング、非同期クエリ

ここで、Personには別のモデルオブジェクトへの参照があります。Countryとしましょう。 Countriesはそれ自身のテーブルにあり、私はリスト項目にそれを表すために国の名前が必要です(もちろんIDを持っています)。

私は3つのオプションを参照してください。

  1. クエリのPersonデータをロードビュー方式(setPerson()?)からデータベースを。

  2. 国の情報を持つ私のモデルのオブジェクトは、深いプリロード(私はちょうどアップ、申し訳ありません)深いプリインストールしたと思います。

  3. 国データを非同期に照会してからUIに戻すように要求します。

(1)の問題は、UIがブロックする可能性があることです。 (2)の問題は、メモリ内で重いデータの重複が発生することです。 (3)の問題は、流れを複雑にし、おそらく不必要になる可能性があるということです。

どうすればよいですか? (1)のパフォーマンスヒットは重要ですか?たぶん(1)、ビューからデータをクエリしますが、同じCountryのデータベースを繰り返し打つことを避けるためにキャッシュを実装しますか?おそらく(2)、オブジェクトのインスタンスが一意であることを保証するための前記キャッシュ層を備えているか?私が考慮していない第4の選択肢? ORMは何をしていますか?

ありがとうございます!

答えて

2

CursoLoaderで使用しているクエリでPersonCountryテーブルのINNER JOINを実行します。クエリの結果には、単一のカーソルに必要なすべての情報が表示されます。

これはおそらく、物事について行くの最良の/クリーンな方法ですがコメントに応じて

EDIT。この時点でメモリの重複を心配する必要はありません。それは時期尚早の最適化です。それに、あなたのテーブルはどれくらい大きくなるの?ここでエンベロープ計算のやり直しをしましょう。結合されたテーブルの各行が100バイト(これは巨大な行なので、ここではもっと悪いシナリオを考えています)を取ると、結果クエリーに10000行があっても(それはもう少し大きいです)、 1,000,000バイト、または1メガバイト未満のメモリしか使用していません。

+0

それは私の問題を解決しません= /それはオプション2です。 – slezica