簡體   English   中英

從Android sqlite數據庫中檢索大blob

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM