android sqlite加入事務批量插入數據異常回滾

一、當我們操作sqlite批量插入數據出現異常會回滾的實例:

public  boolean insertBySql(DatabaseHelper openHelper,
                                List<Boy> list,String tname) {
    Log.e("開始時間",System.currentTimeMillis()+"");
    if (null == openHelper || null == list || list.size() <= 0) {
        return false;
    }
    SQLiteDatabase db = null;
    try {
        db = openHelper.getWritableDatabase();
        String sql = "insert into "+tname+"(name,age) values(?,?)";
        SQLiteStatement stat = db.compileStatement(sql);
        db.beginTransaction();//開啓事務
        for (Boy boy: list) {
           
                stat.bindString(1, boy.name);
                stat.bindLong(2, boy.age);
        }
        db.setTransactionSuccessful();
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            if (null != db) {
                db.endTransaction();//事務結束
                db.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    Log.e("結束時間",""+System.currentTimeMillis());
    return true;
}

1、加入事務插入數據,保證訪問磁盤只被操作一次,加快了數據插入時間,如不開事務,則出現多次磁盤訪問,訪問磁盤是比較耗時的操作,所以不開啓事務會造成數據插入緩慢

2、以上實例當for循環插入數據出現異常會直接回滾,所有數據插入不成功


二、當我們操作sqlite批量插入數據出現異常做異常處理,會只回滾當前插入不成功的數據,其他數據插入正常進行,代碼如下:

public  boolean insertBySql(DatabaseHelper openHelper,
                                List<Boy> list,String tname) {
    Log.e("開始時間",System.currentTimeMillis()+"");
    if (null == openHelper || null == list || list.size() <= 0) {
        return false;
    }
    SQLiteDatabase db = null;
    try {
        db = openHelper.getWritableDatabase();
        String sql = "insert into "+tname+"(name,age) values(?,?)";
        SQLiteStatement stat = db.compileStatement(sql);
        db.beginTransaction();
        for (Boy boy: list) {
            try {
                stat.bindString(1, boy.name);
                stat.bindLong(2, boy.age);
            }catch (Exception e){
                e.printStackTrace();
                Log.e("出錯",list.indexOf(boy)+"");
            }

        }
        db.setTransactionSuccessful();
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            if (null != db) {
                db.endTransaction();
                db.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    Log.e("結束時間",""+System.currentTimeMillis());
    return true;
}
以上實例解決了批量插入時導致數據全部回滾的問題,只對當前插入數據做回滾
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章