您的位置:首页 > 移动开发 > Android开发

Android数据库事务操作

2015-01-07 20:53 363 查看
Android中的SQLite可以很好的支持事务操作,所谓的事务,就是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全不执行,不能执行某些操作,而不执行其他操作。打个比方,银行的转账操作,A转给B1000块钱,则A的账户中要扣除1000块,B的账户中要增加1000块,这两个行为要么都执行,要么都不执行,不能只执行其中一个操作。

使用Android的SQLite的事务也很简单,开始事务的时候需要调用beginTransaction();执行完一系列的数据库操作后,需要调用setTransactionSuccessful();最后需要调用endTransaction();这样就算成功的执行了依次数据库事务了,具体代码看下面:

假设有一张person表,里面有三个字段:id和name,balance,对balance执行更新操作,用数据库事务来完成:

public void testTransaction() {
		PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
		SQLiteDatabase db = helper.getWritableDatabase();
		if (db.isOpen()) {

			try {
				db.beginTransaction();// 开启事务

				// 减去1000

				db.execSQL("update person set balance = balance - 1000 where name = 'zhangsan'");

				// int result =10/0;

				// 加上1000
				db.execSQL("update person set balance = balance + 1000 where name = 'lisi'");

				db.setTransactionSuccessful();// 标记事务成功

			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				db.endTransaction();
			}

			db.close();
		}

	}


另外一点是当需要插入大量的数据的时候:

// 没加事务:26s
	// 加事务:1s
	public void testTransationInsert() {

		PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
		SQLiteDatabase db = helper.getWritableDatabase();
		if (db.isOpen()) {

			// 记住当前的效率

			long start = System.currentTimeMillis();

			try {
				db.beginTransaction();
				// 开始添加数据
				for (int i = 0; i < 10000; i++) {

					db.execSQL("insert into person(name,age,balance) values('wang"
							+ i + "'," + (10 + i) + "," + (10000 + i) + ")");

				}
				db.setTransactionSuccessful();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				db.endTransaction();
			}

			// 记住结束时间
			long end = System.currentTimeMillis();

			long diff = end - start;

			Log.i(TAG, "耗时:" + (diff / 1000) + "s");

			db.close();
		}

	}


这里需要注意的是这三条语句执行的顺序:
db.beginTransaction() db.setTransactionSuccessful() db.endTransaction()

一般把db.endTransaction()的执行放在finally代码块中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: