13

私と私のAndroidチームには問題があります。ユーザーの連絡帳を拡張情報とともに表示するアプリがあります。

現在の設定

私たちのアプリは、AndroidOSの連絡先プロバイダーを読み取ります。この情報をサーバーに送信し、サーバーが必要なフィールドをいくつか計算します。この情報は後でアプリによって取得され、SQLiteデータベースに保存されます。最終的にデータベースに格納されるのは2つのテーブルです。サーバーが計算したすべての番号とすべての追加情報を含む1つ。もう1つのテーブルは、すべての連絡先を含むテーブルです(1つの連絡先は複数の番号を持つことができます)。この連絡先テーブルは、パフォーマンスのためにのみ作成されました。ユーザーに連絡先帳を提示するときに、CursorAdapterのこの連絡先テーブルのすべての行をカーソルで選択することができます。したがって、連絡先帳をユーザーに提示するときは、独自のSQLiteデータベースと1つのテーブル(JOINなしなど)から読み取るだけで済みます。

主な問題

多くの同期が行われています。データが複製されているため、追加/変更/削除を確認し、すべてのf-ing時間を同期する必要があります。さらに、プレゼンテーション層で特定のものを変更しようとしているときは、この特定の情報を含めるように連絡先テーブルを変更する必要があります。

私たちの優先事項

1番目:ユーザーに連絡帳を提示するときのパフォーマンス。

2番目:コードの保守性。

したがって、「データを複製しないでください。これがすべての問題の根本です」とコメントしないでください。開発者として優れた同期アルゴリズムを作成するために余分な時間を費やす必要がある場合よりも、ユーザーにパフォーマンスの問題がないことが重要です。

ソリューション?

理由はわかりませんが、CursorAdapter(1つのテーブルからすべての行を読み取る)の方が、オブジェクトのリスト(メモリに保持されている)を持つArrayAdapterよりもはるかに優れていると常に思っていました。これが本当かどうか誰か知っていますか?少なくとも半分の方法で役立つ解決策の1つは、起動時に連絡先プロバイダー(ネイティブの連絡先帳)と拡張情報に参加し、これをメモリ内のリストに保存して、ArrayAdapterで提示することです。

独自のコンテンツプロバイダーを作成しますか?独自のコンテンツプロバイダーを作成することについてはほとんど知りません。誰もがネイティブコンタクトブックの情報を拡張してこれらに参加するコンテンツプロバイダーを作成しようとしました。たぶん、このインターフェースの実装で:ContactsContract.DataColumnsWithJoins?誰かが似たようなことを試みましたか?この情報をCursorAdapterに表示するときのパフォーマンスはどうですか?

忘れてしまったかもしれない情報があれば、質問してください。質問を更新します。

すべての役立つヒントと解決策を事前に感謝します!

4

2 に答える 2

1

Android の SQLite は他のプラットフォームと同様に非常に高速ですが、Android 固有の問題がいくつかあるという結論に達しました (高速な DB 操作に大きく依存するアプリ JReader に取り組んでいます)。データベースのパフォーマンスとあなたが尋ねた質問に関するいくつかのアドバイス:

  • コンテンツ プロバイダーを介してデータを共有する予定がない場合、コンテンツ プロバイダーはほとんど役に立ちません。ただし、少なくとも 2 つの利点があります。最初にデータ変更通知を受け取り、カーソルが自動的に更新されます。2 つ目の重要な点は、CursorLoaders にはコンテンツ プロバイダーが必要です。パフォーマンスが重要な場合は、カーソルの読み込みに使用することを強くお勧めします。
  • コレクションへのアクセスは、データベースへのアクセスよりもはるかに高速ですが、とにかくデータを永続化する必要があるため、二重の作業になります。DB アクセスは、超高速スクロール リストのデータを取得する場合でも、特に単一のテーブルからデータを取得する場合でも非常に高速です。問題になることはありません。
  • DB を適切に設計します (JOINS、インデックスなどを使用) :) ただし、カーソル クエリで結合クエリを使用しないでください。常にではありませんが、複数の Android プラットフォーム (4.0 以降を含む) で多くのパフォーマンスの問題が発生しました。結合テーブルにアクセスする方法は、最初に外部キーを取得してから子テーブルをクエリすることです。

私の経験では、DB のパフォーマンスが非常に悪い状況がありましたが、最終的には常にコードを微調整することができ、その結果、パフォーマンスが 10 倍から 100 倍向上しました。したがって、DB コードのプロファイリングを続ければ、目的のパフォーマンスを確実に達成できます。

于 2013-02-05T21:09:42.933 に答える
0

ダンの 2 番目のコメントは本当です.. Android は、画面の下のカーソル ウィンドウを使用して、カーソル (約 1M) からデータをキャッシュします。Cursor Window の Android ドキュメントを参照してください。

2 つのテーブルを別々に結合したくない場合は、より高速な CursorJoiner を検討できます。これは、プロバイダーの 1 つが Contacts を指しているカスタム contentProvider に移動し、 Cursor を返します。同様に、2 つ目は独自のテーブルを指し、カーソルを返します。cursorjoiner は、これらの両方のカーソルを結合できます。

(複雑なプロセスですが)

于 2013-02-05T22:11:46.543 に答える