2012-10-03 5 views
17

Android의 Cursor에 최대 1MB의 데이터 만 저장할 수 있다는 것을 알지 못해도 Android 앱의 sqlite 데이터베이스에 2 진수 데이터 (protobufs)를 저장했습니다. 이제는이 바이너리 blob을 파일에 저장하고 sqlite 데이터베이스 항목의 파일 만 참조해야한다는 것을 알았습니다.Android sqlite 데이터베이스에서 큰 blob 검색

이 바이너리 청크를 파일로 이동하려면 데이터베이스를 업그레이드해야합니다 (앱을 잠시 사용하고 있습니다). 문제는 일부 사용자의 데이터가 이미 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 한계를 초과하는 바이너리 얼룩을 어떻게 검색합니까?

+0

안녕하세요, 감사합니다. 이 질문은 제가 직면했던 동일한 문제를 분석하고 해결하는 데 도움이되었습니다! –

답변

27

큰 얼룩을 조각으로 읽을 수 있습니다.

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

다음 substr와 청크를 읽어 다음 BLOB stream I/O 기능 또는 중 하나를

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

당신은 또한 자신의 SQLite는의 복사 및 액세스를 컴파일 할 수 있습니다 먼저이 치료를 필요로하는 것들을 찾아 NDK가있는 C API의 일반적인 쿼리 함수이지만이 경우 너무 복잡합니다.

+0

정말 고마워요! 이것은 정말로 도움이되었습니다. 나는 SQLite 핵심 기능에 대해 전혀 몰랐다. 완벽하게 일했습니다! – ashughes

+0

전체'byte []'를 구성하기 위해 그 청크를 추가하는 효율적인 방법이 있습니까? –

+0

@KamranAhmed 이미 전체 길이를 알고 있으므로 큰 배열을 할당하고 청크를 복사하십시오. –

0

CL. 대답은 모양이 < 인 경우에만 5MB입니다. 5 메가 바이트보다 큰 BLOB를 사용하려고하면 예외가 발생합니다. 대형 blob을 가져 오려면 sqlite4java 라이브러리를 사용해야하며,이 라이브러리는 커서를 사용하지 않고 데이터베이스에 대한 원시 호출을 사용합니다. 다음은이 라이브러리를 사용하여 큰 얼룩을 가져 오는 예입니다.

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(); 
} 
관련 문제