23

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

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

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

4

2 に答える 2

37

大きなブロブを分割して読み取ることができます。まず、この治療が必要な人を見つけます。

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 でアクセスすることもできますが、この場合は複雑すぎます。

于 2012-10-04T06:47:58.750 に答える