4

SQLiteDatabase.queryを呼び出して、カーソルを取得します。そのカーソルを繰り返し処理している間に、同じスレッドから他のクエリを発行しても安全ですか?

4

2 に答える 2

3

2 つのクエリが同時に同じテーブルで実行されることはありません。これは組み込みの同期メソッドであるため、一度に 1 つのクエリのみを実行します。2 番目のクエリは、最初の実行が完了するまで待機状態になります。

于 2012-05-27T03:20:57.053 に答える
2

はい。同じスレッド内から、複数の未解決のクエリを作成し、各カーソルに個別にアクセスできます。

次のコードをテスト アクティビティに追加したところ、期待どおりに実行されました。

SQLiteDatabase connection = getApplicationContext().openOrCreateDatabase("foo.db", MODE_PRIVATE, null);
try {
    connection.execSQL("drop table if exists person");
    connection.execSQL("create table person (id integer, name string)");
    ContentValues cv = new ContentValues();
    cv.put("id", 1);
    cv.put("name", "leo");
    connection.insert("person", null, cv);
    cv = new ContentValues();
    cv.put("id", 2);
    cv.put("name", "yui");
    connection.insert("person", null, cv);

    Cursor rs = connection.query("person", new String[] {"id", "name" }, null, null, null, null, null);

    while(rs.moveToNext())
    {
        System.out.println("name = " + rs.getString(1));
        System.out.println("id = " + rs.getString(0));

        Cursor rs2 = connection.query("person", new String[] {"id", "name" }, null, null, null, null, null);
        while (rs2.moveToNext()) {
            System.out.println("name = " + rs2.getString(1));
            System.out.println("id = " + rs2.getString(0));
        }
    }
} catch (Exception e) {
    System.out.println("Exception " + e);
}
于 2012-05-27T03:52:51.647 に答える