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