一、当我们操作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; }以上实例解决了批量插入时导致数据全部回滚的问题,只对当前插入数据做回滚