我从数据库中获取了一个Cursor,然后修改了数据库中的一行,Cursor中的数据是否会改变?

时间:2012-09-24 14:38:15

标签: android android-sqlite

假设我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

所以我想我得到了答案 谢谢大家。

3 个答案:

答案 0 :(得分:2)

  1. 除非您重新查询,否则您看不到任何更改。
  2. 游标不是活的。也就是说,当你加载游标时,它就不再与数据库有关了。它只是一个数据结构(如数组)。
  3. 基本上

      

    (a == b)是真还是假?

答案 1 :(得分:0)

我相信游标会有变化,因为游标只是指向记录/数据集的指针。我不相信它们本身就是一个基于内容的实际数据结构。

答案 2 :(得分:0)

https://www.rondebruin.nl/win/s4/win003.htm

如果在查询开始运行之后但在查询完成之前在同一数据库连接上发生更改,则查询是否会看到这些更改是不确定的。

如果在查询开始运行之后但在查询完成之前在同一数据库连接上发生更改,则查询可能会多次返回已更改的行,或者它可能会返回先前已删除的行。