Android SQLite 事务操作初探

Android SQLite 事务执行

事务的一般特性:

原子性

确保事务内的所有操作都执行成功,成功则提交,否则会回滚到事务开启前的状态

隔离性

使事务操作相互独立和透明

一致性

确保数据库在成功提交的事务上正确地改变状态

持久性

确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。

Android中使用SQLite的单例优化

在使用SQLite过程中,如果不使用单例,在比较复杂和数据库操作频繁的情况下,可能会出现锁库的情况。
而单例中,不给数据库加锁可能会出现"打开了已打开的数据库"等异常信息

优化代码如下


private static int mCount;

 public static synchronized AttendanceDao getInstance() {
        if (mAttendanceDao == null) {
            synchronized (AttendanceDao.class) {
                if (mAttendanceDao == null) {
                    mAttendanceDao = new AttendanceDao();
                    dbOpenHelper = new DbOpenHelper(App.getContext());

                }
            }
        }
        return mAttendanceDao;
    }
     public synchronized SQLiteDatabase getDatabase() {
        if (mCount == 0) {
            mDatabase = dbOpenHelper.getWritableDatabase();
        }
        mCount++;
        return mDatabase;
    }

    public synchronized void closeDb(SQLiteDatabase sqLiteDatabase) {
        mCount--;
        if (mCount == 0) {
            sqLiteDatabase.close();
        }
    }

使用事务操作


public void handleDb(){
    SQLiteDatabase db = AttendanceDao.getInstance().getDatabase();
    db.beginTransaction();//开启事务
    try{
        
        ....//数据库操作
        
         db.setTransactionSuccessful();//设置事务执行成功
    }catch(Exception ignore){
        
    }finally{
        db.endTransaction();//结束事务
        closeDb(db);
    }
}

事务执行流程

首先开启事务,之后可以对数据库进行操作

如果操作过程中出现异常,

则会跳出try进入catch最终执行finally中的语句。

由于未执行事务成功操作,所以事务会回滚到最初状态,不对数
据库进行修改等操作。

开启事务

db.beginTransaction();

事务执行成功(即事务提交)
如果执行结束事务前未执行此操作,则会认为操作失败,不会执行commit操作,而是执行rollback操作

db.setTransactionSuccessful();

结束事务

db.endTransaction();

欢迎大家关注我的个人订阅号,一起学习一起交流


Android SQLite 事务操作初探_第1张图片
ajsoft.jpg

你可能感兴趣的:(Android SQLite 事务操作初探)