直接上代码,下面是我做的测试
ContentValues values=new ContentValues();
String[] names={"张三","李四","王五","马六","冯七","王八"};
// DataBaseHelper helper=new DataBaseHelper(DataBaseActivity.this, "test_mars_db");
if(db==null){
db=openOrCreateDatabase("test_mars_db", MODE_WORLD_WRITEABLE, null);
}
db.beginTransaction();//开户事务
try {
for(String name:names){
values.put("name", name);
values.put("address", "花园路");
db.insert("user", null, values);
Log.d(TAG, "插入:"+values.toString());
}
values.put("name", "test");
// db.insert("users", null, values);1
// db.execSQL("update user set n='1' where id=2");2
db.setTransactionSuccessful();//设置事务标志为true
} catch (Exception e) {
e.printStackTrace();
}finally{
//为何要加try...catch
//因为添加了db.setTransactionSuccessful(),若execSQL中出现问题
//则不会执行db.endTransaction()
db.endTransaction(); //结束事务,有2种情况:commit, rollback
}
db.close();
通过上面的代码发现了一点问题,建好数据库中只有表user,当将红色标记1的代码注释掉,即执行红色标记2的代码,事务会回滚,Logcat中打出一串警告,提示没有名称为"n"的列。但是反过来,即注释掉2的代码,执行1的代码,也是就是往一个不存在的表中插数据,这时候程序会报错,但事务却没有回滚,依然向user表中插入了数据。搞不懂是什么原因,哪位大侠清楚,指教一下。