Android中数据库事务介绍
事务概念
在事务中包含的sql,要么同时执行成功 要么同时执行失败, 不能出现 部分成功部分失败的情况 典型案例 银行转账
相关api
1. db.beginTransaction();//开启事务 2. try { 3. ... 4. db.setTransactionSuccessful();//如果所有SQL都执行完毕则标记成功 5. } finally { 6. db.endTransaction();//如果有成功标记则关闭事务,没有成功标记回滚数据 7. }
具体代码
MyOpenHelper类
1. public class MyOpenHelper extends SQLiteOpenHelper { 2. public MyOpenHelper(Context context) { 3. super(context, "Account.db", null, 1); 4. } 5. @Override 6. public void onCreate(SQLiteDatabase db) { 7. db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varchar(20),money varchar(20))"); 8. db.execSQL("insert into info ('name','phone','money') values ('张三','138888','2000')"); 9. db.execSQL("insert into info ('name','phone','money') values ('李四','139999','5000')"); 10. } 11. @Override 12. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 13. } 14.}
MainActivity类
1. public class MainActivity extends Activity { 2. private MyOpenHelper openHelper; 3. @Override 4. protected void onCreate(Bundle savedInstanceState) { 5. super.onCreate(savedInstanceState); 6. setContentView(R.layout.activity_main); 7. //获取MyOpenHelper 用它可以获取SQLiteDatabase 8. openHelper = new MyOpenHelper(this); 9. } 10. public void transaction(View v){ 11. SQLiteDatabase database = openHelper.getWritableDatabase(); 12. //开启事务 13. database.beginTransaction(); 14. try { 15. database.execSQL("update info set money= money-200 where name=?",new String[]{"张三"}); 16. //int i = 100/0; 17. database.execSQL("update info set money= money+200 where name=?",new String[]{"李四"}); 18. //事务所有的sql执行成功之后 调用 setTransactionSuccessful 会加上一个标记说明事务成功执行了 19. database.setTransactionSuccessful(); 20. } catch (Exception e) { 21. Toast.makeText(getApplicationContext(), "服务器忙,请稍后再试", 0).show(); 22. }finally { 23. //事务结束 会检查标记 如果没有成功标记则回滚 如果有成功标记则提交生效 24. database.endTransaction(); 25. } 26. } 27.}