0

私は現在、Android APIをいじっています。現在、私は GUI データベース バインディングを少し行っていますが、少しイライラし始めています。

ListActivityリストアイテムのカスタムレイアウトを備えたシンプルなものがあります。ListViewここで、基礎となるものをデータベース内のテーブルにバインドしたいと考えています。データベースに変更を加えるたびに、ListView に通知して自分自身を更新し、GUI を更新できるようにしたいと考えています。最初は、問題は簡単に見えます: を追加しSimpleCursorAdapter、データを取得するためのカーソルを渡し、列をレイアウト ID にバインドし、下に移動するだけです。更新を行いたいときはいつでもnotifyDataSetChanged()、ListView を呼び出すだけで完了ですよね? いいえ!

この方法では、UI スレッドでデータベースにクエリが実行されますが、パフォーマンスが低下し、「アプリケーションが応答しません」というエラーが発生する可能性があるため、明らかに悪いことです。

現在のところ、Loader と ContentProvider を使用するしか方法がないようです。これはデータ アクセスを処理する最も抽象的でクリーンな方法かもしれませんが、膨大な量のコードも追加します (特に ContentProvider 自体で、リクエストを「解析」するために多くの醜い if-else スイッチケース処理を行う必要があります)。 )。

私の質問は次のとおりです。データベース テーブルを ListView (またはその他の UI コンポーネント) に接続する最新の (および API レベル <11 との後方互換性がある) 方法は何ですか? 本当に ContentProvider を使用する必要がありますか?

そして、なぜこれはとても複雑なのですか?つまり、Bluetooth デバイスのスキャンは約 20 行のコードで実装できますが、(私の観点から) data-ui-connection のようなより一般的なものについては、それぞれ 100 以上の loc を持つ少なくとも 2 つのクラスを実装する必要があります。これは狂気です!

4

1 に答える 1

0

...しかし、大量のコードも追加されます (特に、リクエストを「解析」するために多くの醜い if-else スイッチケース処理を行う必要がある ContentProvider 自体で)。

なぜそれが起こるのかわかりません。Loadersin a SimpleCursorAdapterfor aを実装するために必要なコードは、インターフェイスの他の 2 つのコールバックで返されたものをスワップするin ans をContentProviderインスタンス化することです。プロバイダーでは、.CursorLoaderonCreateLoaderCursorLoaderManager.LoaderCallbackssetNotificationUriCursor

本当に ContentProvider を使用する必要がありますか?

データベースが変更された後にデータを更新することから利益を得たい場合はCursorLoader、はい。いつでも自分の手で問題を解決し、自分でクエリを実行できます。

于 2012-12-10T10:46:01.980 に答える