1

SqLiteデータベースから1つの列のみをフェッチしていますが、カーソルオブジェクトに1 MBを超えるデータが含まれているため、データベースクエリを分割できません。カーソルが最初の行をフェッチするとすぐにカーソル処理を中断することは可能ですか?その特定の時間に、このカーソルオブジェクトの値を別のオブジェクトに保持したいと思います。そのカーソルがこの値をクリアし、データベースの2番目の行をフェッチするために次へ移動した後、これはレコードの終わりまで続きますか?

4

2 に答える 2

1

Cursor(SQLiteCursor) を使用している場合 - 最初の行をフェッチした後、カーソルが「メモリを消費する」(あなたが言うように処理を中断する) のを防ぐ方法はありません。

android.database.sqliteは、C で記述された sqlite3 ライブラリの Java ラッパーです。
実際には、sqlite3 には、ステートメントが生成するレコードの数をカウントする関数がないため、sqlite3_step関数が返されるまで、関数を使用して結果セット全体をスキャンする必要がありますSQLITE3_DONE
SQLiteCursorから導出されCursorWindowます。 CursorWindow(いくつかのネイティブメソッドがあります)Cursors getCount()メソッドが初めて呼び出された時点で、行の数を計算し、これらの行をキャッシュするという2つのことを行います。 必要な機能を備えたAndroid用のsqlite3の カスタムポート(ロシア語)

が あります。ロシア語が読めない場合: Java コード


ネイティブ コード
ネイティブ ソース

于 2012-10-09T19:17:06.847 に答える
1

次のようにするとどうなりますか?(これは単なるアイデアです) 必要なすべての行を id 列のみでフェッチします (blob 列の代わりに id をフェッチします)。そのカーソルを繰り返しスローし、行ごとに、指定された ID の 1 つの行のみを BLOB でフェッチします。次に、そのカーソルを閉じて、次の id 行用に新しいものを開きます。

//just fetch the ids of the wanted rows
Cursor idCursor = db.query("TABLE_NAME",new String[]{"_id"}, null, null, null,null,null);
Cursor blobCursor;

    //for each row (id)
    while(idCursor.moveToNext())
    {

        //fetch one row with the blob of the given id
        blobCursor = db.query("TABLE_NAME",new String[]{"image"}, "_id = ?", new String[] {new Long(idCursor.getLong(0)).toString()}, null,null,null);

        if(blobCursor.moveToFirst())
        {

            //get the blob and store it
            blobCursor.getBlob(0); 

        }

        blobCursor.close(); //close the cursor (and release resources)

    }
idCursor.close();
于 2012-10-10T07:52:50.763 に答える