1

假设我得到一个Cursorby 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 回答