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);
}
@Override
public 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')");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
MainActivity类
public class MainActivity extends Activity {
private MyOpenHelper openHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取MyOpenHelper 用它可以获取SQLiteDatabase
openHelper = 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();
}
}
}