像这样的东西:
@H_419_13@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();// Delete datadb.delete("Foo",whereClause,whereValues);db.setTransactionSuccessful();db.endTransaction();所以我想获取我要删除的数据,以通知UI组件数据已被删除.
我使用多个线程,并希望确保在查询和删除之间没有更改表中的其他数据.
我可以在java中使用synchronized等执行此 *** 作或锁定整个数据库(我只会将其作为最后一个选项).
那么这个用例可以使用事务吗?如果是,如何在写入和读取事务中使用getWriteableDatabase()和getReadableDatabase()?
使用事务是否保证将删除之前已查询过的那些数据?并且不可能在SELECT查询和DELETE之间插入另一个datarecord(例如由另一个Thread)…我想避免删除前一个SELECT查询尚未查询的数据记录(因为它已经在SELECT查询之后和DELETE语句之前插入了)
示例:我有一个名为Foo的表:
@H_419_13@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的行.
让我们假设现在,在执行DELETE statemet之前,另一个Thread已插入一行,以便表格如下所示:
@H_419_13@ID | Col1 | Col2 ---|------|----- 1 | 1 | 1 ---|------|----- 2 | 0 | 1 ---|------|----- 3 | 1 | 1 ---|------|----- 4 | 1 | 1接下来将执行DELETE语句:DELETE FROM Foo WHERE Col1 = 1 AND Col2 = 1
因此删除ID = 1,ID = 3和ID = 4的行.
但是前一个SELECT的结果集是ID = 1且ID = 3的行.
所以我丢失了ID = 4的行而没有注意到.
这正是我想要避免的.
我想这将是LOCK的用例,但我不喜欢LOCKS ……
解决方法 试试这个: @H_419_13@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.delete("Foo","_ID = " + ID,null); } db.setTransactionSuccessful();}catch { //Error in between database transaction }finally { db.endTransaction();}我不确定我是否可以迭代光标并同时删除行.如果没有,您可以先将ID保存在数组中.
总结以上是内存溢出为你收集整理的android – 带读写的Sqlite事务全部内容,希望文章能够帮你解决android – 带读写的Sqlite事务所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)