Sqlite事务

时间:2013-12-03 15:22:47

标签: android sqlite transactions android-sqlite

是通过使用getWriteableDatabase()检索数据库两次来保存以开始和提交事务。如果我想在一个事务中使用两个DAO,那么我有这种情况

这样的事情:

SqliteDatabase db = userDao.getWriteableDatabase();

try{

    userDao.insert(firstname, lastname);
    addressDao.insert(street);
    // commit
    db.setTransactionSuccessful();
    db.endTransaction();
catch(Exception e){
    // rollback
    db.endTransaction();
}

其中:

class UserDao extends Dao {

    public void insert(String firstname, String lastname){

       SqliteDatabase db = getWriteableDatabase();

       ...
       db.insertOrThrow(...);
     }

}

class AdressDao extends Dao {

    public void insert(String street){

       SqliteDatabase db = getWriteableDatabase();

       ...
       db.insertOrThrow(...);
     }

}

getWriteableDatabase()只是SQLiteOpenHelper.getWriteableDatabase()

的快捷方式

在事务中以这种方式工作是否安全,或者getWriteableDatabase()是否返回另一个实例,因此事务不再在正确的范围内?

如果是这样,我可以将SqliteDatabase作为参数传递给DAO,例如

SqliteDatabase db = userDao.getWriteableDatabase();

try{

    userDao.insert(db, firstname, lastname);
    addressDao.insert(db, street);
    // commit
    db.setTransactionSuccessful();
    db.endTransaction();
catch(Exception e){
    // rollback
    db.endTransaction();
}

1 个答案:

答案 0 :(得分:0)

getWritableDatabase()在第一次调用时创建实例并缓存返回的值。所以你没有打开数据库两次,是的,这是安全的。