私は非常に速く完了する必要がある Android プロジェクトに取り組んでいます。
アプリの機能の 1 つは、SQLite データベース コンテンツを読み込み、ListActivity 内の ListView にリストすることです。
データベースにはいくつかのテーブルが含まれており、そのうちの 2 つは非常に大きいです。
データベース内の各項目には多くの列があり、そのうち少なくとも 2 つ (名前、価格) を表示する必要がありますが、できれば 3 つです。
アプリのこの部分で行う必要があるのは、データベースを読み取ってリストすることだけなので、これは非常に簡単な作業に思えるかもしれません。これを問題なく実行し、アプリと小さなサンプル データベースを比較してテストしました。
私の最初のバージョンでは、Cursor を使用してクエリを取得し、次に ArrayAdapter をリストのアダプターとして使用しました。クエリの後、カーソルを最初から最後までループし、位置ごとに Cursor のコンテンツをアダプターに追加します。
onItemClickListener は、データベースに対して他のパラメーター (基本的にはカテゴリを開きます) に対して再度クエリを実行するため、アダプターをクリアし、カーソルをループして、そのコンテンツをアダプターにもう一度追加します。
アプリは魔法のように機能しましたが、現実の大きなデータベース (>300MB) を使用すると、コンテンツの表示に突然アプリが非常に長くかかり、時にはブロックすることさえありました。
そこで私はいくつかの調査を行い、通常のパラメーター (String[] from、int[] to など) を使用して Cursor の内容を ListView に自動的にリンクする SimpleCursorAdapter の使用を開始しました。 .R.id.text1 および text2)。
問題は、ロード時間があまり変わらないことです。
さまざまな Web サイトやチュートリアルでいくつかの提案されたソリューションに出くわしましたが、それらのほとんどは何らかの形で AsyncTask クラスを使用しています。これを自分で手動で実装しようとしましたが、複数のスレッドを追跡するのが難しく、失敗しました。
チュートリアルでは、コンテンツ プロバイダーでこれを行う方法を説明し続けていますが、私の特定の状況について明確なものは何も見つかりませんでした: 非常に大きな SQLite データベース -> ListView への読み取り。
今、私の頭は、LoaderManager、LoaderAdapter などの概念で満たされ、頭の中ですべてが混ざり合って混乱しています。
この「単純な」タスクを実行するための完全で、素晴らしく、クリーンなソリューションを誰かに提供してもらえますか?
繰り返しますが、BIG SQLiteDatabase を読み取り、ListView に表示したいと考えています。アプリがブロックされないようにしたい。
パラメーターとしてクエリと ListActivity のコンテキストを受け取り、クエリの結果をビューに表示することを処理するメンバー関数を持つクラスが必要です。
抽象的な回答はしないでください。時間がなくなり、今非常に混乱しており、クリーンで完全なソリューションが必要です。
あなたは私の唯一の希望です。