Android sqliteデータベースから大きなBLOBを取得する 質問する

Android sqliteデータベースから大きなBLOBを取得する 質問する

Android がCursor最大 1 MB のデータしか保持できないことに気づかずに、バイナリ データ (protobufs) のチャンクを Android アプリの sqlite データベースに保存しました。今では、これらのバイナリ ブロブをファイルに保存し、sqlite データベース エントリ内のファイルのみを参照する必要があることがわかりました。

これらのバイナリ チャンクをファイルに移動するには、データベースをアップグレードする必要があります (アプリはしばらく使用されていました)。問題は、一部のユーザーのデータがすでに 1 MB の制限を超えている可能性があり、データベースから取得できないことです (Cursor大きな BLOB を含む単一行の結果にアクセスすると、 がスローされますIllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialize before accessing data from it)。

CursorSQLite データベースに保存されている1 MB の制限を超えるバイナリ BLOB を取得するにはどうすればよいですか?

ベストアンサー1

大きな blob は分割して読み取ることができます。まず、どの blob がこの処理を必要とするかを調べます。

SELECT id, length(blobcolumn) FROM mytable WHERE length(blobcolumn) > 1000000

そしてチャンクを読んでsubstr:

SELECT substr(blobcolumn,       1, 1000000) FROM mytable WHERE id = 123
SELECT substr(blobcolumn, 1000001, 1000000) FROM mytable WHERE id = 123
...

また、SQLiteのコピーをコンパイルして、BLOB ストリーム I/O関数または C API の通常のクエリ関数を NDK で使用することもできますが、この場合は複雑すぎます。

おすすめ記事