Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 带读写的Sqlite事务大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以在 android中使用事务来读取稍后将在同一事务中删除的值?

像这样的东西:

sqliteDatabase db = Helper.getReadableDatabase();
db.begintransaction();

String whereClause = "COL1 = ? AND COL2 = ?";

// make a SELECT Query to read data 
cursor c = db.rawQuery("SELECT * FROM Foo "+whereClause,whereValues);

...
// read cursor data etc. 
...

db = Helper.getWriteableDatabase();
// @R_675_9421@e data
db.@R_675_9421@e("Foo",whereClause,whereValues);

db.settransactionsuccessful();
db.endtransaction();

所以我想获取我要删除的数据,以通知UI组件数据已被删除.

我使用多个线程,并希望确保在查询删除之间没有更改表中的其他数据.

我可以在java中使用synchronized等执行此操作或锁定整个数据库(我只会将其作为最后一个选项).

那么这个用例可以使用事务吗?如果是,如何在写入和读取事务中使用getWriteableDatabase()和getReadableDatabase()?

使用事务是否保证将删除之前已查询过的那些数据?并且不可能在SELECT查询和@R_675_9421@E之间插入另一个datarecord(例如由另一个Thread)…我想避免删除一个SELECT查询尚未查询的数据记录(因为它已经在SELECT查询之后和@R_675_9421@E语句之前插入了)

例:我有一个名为Foo的表:

ID | COL1 | COL2
 ---|------|-----  
  1 |  1   |   1
 ---|------|-----
  2 |  0   |   1
 ---|------|-----
  3 |  1   |   1

让我们假设我使用交易方法
我将执行SELECT * FROM Foo WHERE COL1 = 1 AND COL2 = 1.结果我将获得ID = 1且ID = 3的行.

让我们假设现在,在执行@R_675_9421@E statemet之前,另一个Thread已插入一行,以便表格如下所示:

ID | COL1 | COL2
 ---|------|-----
  1 |  1   |   1
 ---|------|-----
  2 |  0   |   1
 ---|------|-----
  3 |  1   |   1
 ---|------|-----
  4 |  1   |   1

接下来将执行@R_675_9421@E语句:@R_675_9421@E FROM Foo WHERE COL1 = 1 AND COL2 = 1

因此删除ID = 1,ID = 3和ID = 4的行.

但是前一个SELECT的结果集是ID = 1且ID = 3的行.
所以我丢失了ID = 4的行而没有注意到.

这正是我想要避免的.

我想这将是LOCK的用例,但我不喜欢LOCKS ……

解决方法

试试这个:

long id;
db = Helper.getWriteableDatabase();

db.begintransaction();
cursor c = db.rawQuery("SELECT * FROM Foo " + whereClause,whereValues);
try {
    while (cursor.moveToNext()) {
        id = cursor.getLong(cursor.getcolumnIndex("_id"));
        db.@R_675_9421@e("Foo","_id = " + id,null);
    }
    db.settransactionsuccessful();

}catch {
            //Error in between database transaction 
}finally {
    db.endtransaction();

}

我不确定我是否可以迭代光标并同时删除行.如果没有,您可以先将ID保存在数组中.

大佬总结

以上是大佬教程为你收集整理的android – 带读写的Sqlite事务全部内容,希望文章能够帮你解决android – 带读写的Sqlite事务所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。