[英]Retrieve large blob from Android sqlite database
我在Android應用程序的sqlite數據庫中存儲了大量的二進制數據(protobufs),卻沒有意識到Android的Cursor
最多只能容納1MB的數據。 我現在知道我應該將這些二進制blob存儲在文件中,並且只引用sqlite數據庫條目中的文件。
我需要升級數據庫(應用程序已經使用了一段時間)才能將這些二進制塊移動到文件中。 問題是某些用戶的數據可能已超過1MB限制,我無法從數據庫中檢索它(訪問包含大blob的單行的結果Cursor
會拋出IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialize before accessing data from it
)。
如何檢索大小超過sqlite數據庫中存儲的1MB Cursor
限制的二進制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副本,並使用NDK訪問BLOB流I / O函數或C API的常規查詢函數,但在這種情況下這將太復雜。
CL。 回答只有blob <5MB。 如果你嘗試使用大於5兆字節的blob,你仍然會得到異常。 要獲取大blob,您需要使用名為sqlite4java的庫,該庫使用對數據庫的本機調用而不使用游標。 以下是使用此庫獲取大型blob的示例:
SQLiteConnection sqLiteConnection=null;
SQLiteStatement sqLiteStatement=null;
try
{
File databaseFile = context.getDatabasePath("database.db");
sqLiteConnection=new SQLiteConnection(databaseFile);
sqLiteConnection.open();
sqLiteStatement=sqLiteConnection.prepare("SELECT blob FROM table WHERE id=?");
sqLiteStatement.bind(1, id);
sqLiteStatement.step();
byte[] blob=sqLiteStatement.columnBlob(0);
}
finally
{
if(sqLiteStatement!=null)
sqLiteStatement.dispose();
if(sqLiteConnection!=null)
sqLiteConnection.dispose();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.