分享

android SQLite数据库事务操作 | 书籍信息分享

 天海544 2014-07-07

在android应用程序开发中,在使用到数据库的时候,事务处理是非常重要的。

首先android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个事务能大大提高处理速度。

其次是保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚。

mDatabase.beginTransaction();
try{
//在这里执行多个数据库操作
//执行过程中可能会抛出异常
mDatabase.setTransactionSuccessful();//事务的标识,标识是否执行操作并成功执行到底
//在setTransactionSuccessful和endTransaction之间不进行任何数据库操作
}catch(Exception e){
//当数据库操作出现错误时,需要捕获异常,结束事务
mDatabase.endTransaction();
throw e;
}
//当所有操作执行完成后结束一个事务
mDatabase.endTransaction();
}
———————
使用事务操作SQLite数据库
——————–
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标识是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。使用例子如下:
SQLiteDatabase db = ….;
db.beginTransaction();//开始事务
try {
db.execSQL(“insert into person(name, age) values(?,?)”, new Object[]{“传智播客”, 4});
db.execSQL(“update person set name=? where personid=?”, new Object[]{“传智”, 1});
db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
} finally {
db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
}
db.close();

上面两条SQL语句在同一个事务中执行。
使用SQLiteOpenHelper获取用于操作数据库的SQLiteDatabase实例
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String name = “itcast”; //数据库名称
private static final int version = 1; //数据库版本
……略
}
public class HelloActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
……
Button button =(Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL(“insert into person(name, age) values(?,?)”, new Object[]{“传智播客”, 4});
db.close();
}});
}
}
第一次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper会缓存当前的SQLiteDatabase实例,SQLiteDatabase实例正常情况下会维持数据库的打开状态,所以在你不再需要SQLiteDatabase实例时,请及时调用close()方法释放资源。一旦SQLiteDatabase实例被缓存,多次调用getWritableDatabase()或getReadableDatabase()方法得到的都是同一实例。
演示实例
编写Service

public class PersonService {
private DBOpenHelper dbOpenHelper;

public PersonService(Context context){
dbOpenHelper = new DBOpenHelper(context);
}

public void payment(){
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();

db.beginTransaction();
try{
db.execSQL(“update person set amount=amount-10 where personid=1″);
db.execSQL(“update person set amount=amount+10 where personid=2″);
db.setTransactionSuccessful();
}finally{
//事务标志的默认值为false
db.endTransaction(); //提交、回滚,由事务标志决定,如果事务标志为True(成功),提交,否则回滚
}
}





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多