1

私が を得ると仮定しCursorますdb.query()
次に、行のフィールドを変更するdb.update()と、この行はCursor以前に照会されたものに含まれます。このカーソルのデータは変更されますか?

このような:

Cursor cur = db.query("[some parameter can get row 0]"); 
cur.moveToFirst; 
int a = cur.getInt(0);
db.update("[some parameter can modify row 0 col 0]");
int b = cur.getInt(0);

(a==b) は真か偽か?

====== 2012.10.1 編集 =========
私はプロのプログラマーではなく、忙しすぎて最近はコーディングできません。
もし私があなたを不幸にしたら、本当にごめんなさい。
やっと一週間休みが取れました(笑)。

次のようなコーディングを行います。

SQLiteOpenHelper h = null;
SQLiteDatabase db = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    h=new SQLiteOpenHelper(this, "test.db", null,1){

        @Override
        public void onCreate(SQLiteDatabase arg0) {
            // TODO Auto-generated method stub
            arg0.execSQL("CREATE TABLE t1 (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT )");
            arg0.execSQL("INSERT INTO t1 (name) VALUES ('name_wrong')");
        }

        @Override
        public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
            // TODO Auto-generated method stub

        }};

    db=h.getWritableDatabase();
    Cursor cur =  db.query("t1", null, null, null, null, null, null);
    cur.moveToFirst();
    String s1=cur.getString(1);

    db.execSQL("UPDATE t1 SET name = 'name_right'");

    String s2=cur.getString(1);
    Log.d("","s1 = "+s1);
    Log.d("","s2 = "+s2);
    Log.d("","s1 == s2 is "+s1.equals(s2));
    Log.d("","requery...");
    cur =  db.query("t1", null, null, null, null, null, null);
    cur.moveToFirst();
    s2=cur.getString(1);
    Log.d("","s1 = "+s1);
    Log.d("","s2 = "+s2);
    Log.d("","s1 == s2 is "+s1.equals(s2));
}  

そしてlogcatは次のように言います:

10-01 03:11:28.356: D/(1514): s1 = name_wrong
10-01 03:11:28.356: D/(1514): s2 = name_wrong
10-01 03:11:28.356: D/(1514): s1 == s2 is true
10-01 03:11:28.356: D/(1514): requery...
10-01 03:11:28.356: D/(1514): s1 = name_wrong
10-01 03:11:28.356: D/(1514): s2 = name_right
10-01 03:11:28.356: D/(1514): s1 == s2 is false

だから私は答えを得たと思います 皆さんありがとう。

4

3 に答える 3

2
  1. 再クエリしない限り、変更は表示されません。
  2. カーソルはライブではありません。つまり、カーソルをロードした時点で、データベースとは何の関係もありません。これは単なるデータ構造 (配列など) です。

基本的

(a==b) は真か偽か?

間違い

于 2012-09-26T14:51:11.777 に答える
0

カーソルはレコード/データセットへの単なるポインターであるため、カーソルに変更があると思います。それら自体が実際のコンテンツベースのデータ構造であるとは思いません。

于 2012-09-24T14:42:20.490 に答える
0

https://sqlite.org/isolation.html

クエリの実行が開始された後、クエリが完了する前に同じデータベース接続で変更が発生した場合、クエリがそれらの変更を確認するかどうかは未定義です。

クエリの実行が開始された後、クエリが完了する前に同じデータベース接続で変更が発生した場合、クエリは変更された行を複数回返すか、以前に削除された行を返す可能性があります。

于 2017-10-23T11:19:44.617 に答える