web-dev-qa-db-ja.com

Android SQLiteDatabaseのカーソルサイズ制限

インターネットからデータベースをダウンロードします。 datasesフォルダーに保存して開きます。データベース内には、6つのフィールドを持つテーブル「Ads」があります。これらのフィールドのうち2つはBLOBです。このテーブルから読み取りたい場合...問題があります... 1メガバイトを超えるblobフィールドを持つ行を読み取ると、例外が発生することに気付きました... "行からフィールドスロットを取得します0列0が失敗しました」。それが小さな塊なら、すべて大丈夫です...事前に感謝します:)

21

動的な解凍により、内部アセットには1MBの制限があります。 1MBの制限はカーソルblobにも適用されるようですが、これはどこにも文書化されていないようです。

一般に、SQLiteのblobはパフォーマンスが低いため、避ける必要があります。代わりに、blobデータをファイルとして保存し、ファイルの場所をDBに保存します。

54
Joseph Earl

SQLiteデータベースから100KB未満のBLOBを読み取る方が、ファイルシステムから読み取るよりも高速です。ただし、それより大きいものはすべて、データベース内の参照とともにディスクに保持するのが最適です。詳細: http://www.sqlite.org/intern-v-extern-blob.html

12

操作ごとに1MBの制限があります。 (これが行ごとなのか、SQLiteクエリの場合は列ごとなのかわかりません)。この制限は、SQLiteAPIがバインダー/パーセルIPCシステムを介してアウトプロセスでsqliteと対話するためです。同じ制限がバンドル内の値に適用されます(たとえば、インテントエクストラ)。

バインダートランザクションバッファーの固定サイズは制限されており、現在は1Mbであり、プロセスで進行中のすべてのトランザクションで共有されます。

参照: http://developer.Android.com/reference/Android/os/TransactionTooLargeException.html

10
Mark Renouf

AndroidのBLOBサポートはまだ実装されていないようです...

http://www.basic4ppc.com/forum/basic4Android-updates-questions/6648-support-sqlite-blob.html

BLOBフィールドにはどのようなデータが格納されていますか?私は写真を推測します。

BLOBを使用しないことをお勧めします。バイナリデータには、ファイルシステムの方がはるかに適しています。

データベースで何を達成したいのか、もう少し説明していただけますか?

1
Jonathan

使用しているクエリは「選択中」と言っていますか?省略できますか?できない場合は、以下を使用していますか?

 blob = rs.getBlob(column) ;
 InputStream in = blob.getBinaryStream();

または

 blob.getBytes(1, lengthOblob) ;

最初の方法では、blobをチャンクで読み取ることができます。 2つ目は、blobを一度にロードすることです。

0
Andrew