インターネットからデータベースをダウンロードします。datasesフォルダーに保存して開きます。データベース内には、6つのフィールドを持つテーブル「Ads」があります。これらのフィールドのうち2つはBLOBです。このテーブルから読み取りたい場合...問題があります...1メガバイトを超えるblobフィールドを持つ行を読み取ると、例外が発生することに気付きました..."行からフィールドスロットを取得します0列0が失敗しました」。それが小さな塊なら、すべて大丈夫です...事前に感謝します:)
5 に答える
動的解凍により、内部アセットには1MBの制限があります。1MBの制限はカーソルブロブにも適用されるようですが、これはどこにも文書化されていないようです。
一般に、SQLiteのblobはパフォーマンスが低いため、避ける必要があります。代わりに、blobデータをファイルとして保存し、ファイルの場所をDBに保存します。
SQLiteデータベースから100KB未満のBLOBを読み取る方が、ファイルシステムから読み取るよりも高速です。ただし、それよりも大きいものはすべて、データベース内の参照とともにディスクに保持するのが最適です。詳細:http ://www.sqlite.org/intern-v-extern-blob.html
操作ごとに1MBの制限があります。(これが行ごとなのか、SQLiteクエリの場合は列ごとなのかわかりません)。この制限は、SQLiteAPIがバインダー/パーセルIPCシステムを介してアウトプロセスでsqliteと相互作用するためです。同じ制限がバンドル内の値に適用されます(たとえば、インテントエクストラ)。
バインダートランザクションバッファーの固定サイズは制限されており、現在は1Mbであり、プロセスで進行中のすべてのトランザクションで共有されます。
参照:http ://developer.android.com/reference/android/os/TransactionTooLargeException.html
AndroidでのBLOBサポートはまだ実装されていないようです...
http://www.basic4ppc.com/forum/basic4android-updates-questions/6648-support-sqlite-blob.html
BLOBフィールドにはどのようなデータが保存されますか?私は写真を推測します。
BLOBを使用しないことをお勧めします。バイナリデータには、ファイルシステムの方がはるかに適しています。
データベースで何を達成したいのか、もう少し説明していただけますか?
使用しているクエリは「selecting」と言っていますか?省略できますか?できない場合は、以下を使用していますか?
blob = rs.getBlob(column) ;
InputStream in = blob.getBinaryStream();
また
blob.getBytes(1, lengthOblob) ;
最初の方法では、blobをチャンクで読み取ることができます。2つ目は、blobを一度にロードすることです。