2012-04-29 11 views
9

私はテーブルにビットマップを格納する必要があるプロジェクトに取り組んでいます。これらのビットマップは、リストに表示されるデータアダプタで使用されます。この表には、1000を超えるイメージが含まれている可能性があります。私が現在ファイルに保存していないのは、画像を読み込んでDBに書き込むことができるためです。SQLiteカーソルはどのように内部的に動作しますか?

私が本質的に探しているのは、SQLiteのカーソルの限界を理解することです。カーソルはどのようにメモリにロードされますか?クエリ結果をメモリに配置するのか、それとも何らかのタイプの一時的な読み取り/書き込みファイルを作成しますか?大規模なデータセットをクエリするとデバイスのメモリが不足する問題に遭遇したくありません。

+0

[CursorWindow](http://developer.android.com/reference/android/database/CursorWindow.html)があり、 'moveToXyz'のたびにクエリの一部を読み込むために使用されているようです。データはデータベースから直接取得する必要があります。 – zapl

+0

"私はテーブルにビットマップを格納する必要があるプロジェクトに取り組んでいます。" - ick。 "この表にはおそらく1000以上の画像が含まれている可能性があります。" - より多くのick。 「私が現在ファイルに保存していないのは、画像を読み込んでDBに書き込むことができるためです。 - 定義上、ファイルは高速または高速です。なぜなら、SQLiteはそのファイルをファイルに格納しなければならないからです。その情報のために – CommonsWare

+0

zaplありがとう。 @CommonsWare何が意味するのかわからない:P dbよりもファイルを読むのが速くなければならないと思われる。私はそれらを使用する方法以外のカーソルについてはあまり知らないのですが、SQLiteはデータの読み方を高度に最適化していませんか?私は、ファイルから複数回画像データを読み込むのがカーソルから読み込むよりもずっと遅いようです。 – Jona

答えて

0

これは古い投稿です。私の解決策は、イメージをファイルに保存し、イメージへのパスをデータベーステーブルに保存することでした。これはよりクリーンで、はるかに速く見えました。

大きなバイナリデータをテーブルに保存するという考えは、正しいことではありません。なぜ私は良いアイデアではないかという詳細な情報はありませんが、それはちょっとした研究から私が感じることです。

1

思い出したように、メモリにキャッシュされた結果はたくさん残っています。通常はsoft heap limitの下にとどまるべきです。これはアドバイザリの制限であるため、SQL_NOMEMを返すよりも制限を超えることをお勧めします。

キャッシングメカニズムがディスクに書き込まれているとは思いません。各画像がメモリに収まり、インデックスに含まれていない限り、それは問題ではありません。

私はそれが価値があるため、アンドロイドのプログラマーではありません。これらのもののいくつかはカスタマイズされている可能性があります。

背景として、sqlite_stepはデフォルトライブラリのカーソルです。私はアンドロイドがそれ自身の仕組みを実装しているのかどうかわからない。あなたのページには、dynamic memory allocationについての一般的な情報があります。

関連する問題