一、當我們操作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; }以上實例解決了批量插入時導致數據全部回滾的問題,只對當前插入數據做回滾