2011-05-23 15 views
0

この例外をスローしている 'sqlite'データベースでSQLクエリを実行しています: "java.lang.IllegalStateException :「java.lang.IllegalStateException:行0 col 0からフィールドスロットを取得できませんでした」

db.rawQuery("SELECT data FROM session_data WHERE session_id = ?", new String[] { String.format("%d", session_id) }); 
if (!cursor.moveToFirst()) return; 
bytes[] bytes = cursor.getBlob(0); 

列が存在する、と私はadb shell sqlite3 /path/to/database.dbを使用してログインしている場合、私は成功し、同じクエリを実行することができます:私が呼び出したときに0 COL 0」は失敗した行からフィールドスロットを取得します。

結果のカーソルは、名前が「データ」である1つの列で選択された1つの行があることを示します。ブロブのサイズは約1.5 MBです - そうかもしれませんか? cursor.GetColumnIndex("data")が0を返すことを確認したので、列が存在します。

これはAndroid 2.1 SDKで動作しています。何か案は?

答えて

3

問題はブロブがあまりにも大きかったということだったであることを確認してください。ブロブのサイズが1メガバイトを超えるとcursor.getBlob(0)が失敗するようです。セグメント内のブロブを読むと、私の問題が解決しました:

// get length of blob data 
Cursor cursor = db.rawQuery("SELECT LENGTH(data) AS len FROM table WHERE id = ?", etc); 
if (cursor == null || !cursor.moveToFirst()) throw new Exception("failed"); 
int size = cursor.getInt(cursor.getColumnIndexOrThrow("len")); 
cursor.close(); 

// read a segment of the blob data 
cursor = db.rawQuery("SELECT SUBSTR(data,0,500000) AS partial FROM table WHERE id = ?", etc); 
if (cursor == null || !cursor.moveToFirst()) throw new Exception("failed"); 
byte[] partial = cursor.getBlob(cursor.getColumnIndexOrThrow("partial")); 
cursor.close(); 

// copy partial bytes, repeat until the whole length has been read... 
1

rawQueryからのカーソルへの参照を保持しているとします。 カーソルから値を取得する前に、cursorが最初に-1に設定されているので、cursor.moveToFirst()に電話する必要があります。正しい方法は次のようになります。

Cursor cursor = db.rawQuery("SELECT data FROM session_data WHERE session_id = ?", new String[] { String.format("%d", session_id) }); 
if(cursor!= null && cursor.moveToFirst()){ // checking if the cursor has any rows 
    bytes[] bytes = cursor.getBlob(0); 
} 

も、データベース内の自分の列がblobタイプ

+0

私は実際にこれをやっていました - 私は質問を更新しました。ありがとう。 –

関連する問題