ATM在我的Android应用程序中写入SQLite时,我这样做:
try {
for (User user: users) {
ContentValues values = new ContentValues();
databaseManager.database.beginTransaction();
values.put("user_name", user.getName());
values.put("user_email", user.getEmail());
databaseManager.database.insert("users", null, values);
}
databaseManager.database.setTransactionSuccessful();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
databaseManager.database.endTransaction();
}
Run Code Online (Sandbox Code Playgroud)
但是当我从数据库中读取时,我不使用begin,setsuccessful和end:
Cursor cursor = databaseManager.database.rawQuery(SQLQueries.getUsers(), null);
if (cursor.moveToFirst()) {
if (cursor!=null) {
do {
User user = new User();
try {
user.setName(cursor.getString(cursor.getColumnIndexOrThrow("user_name")));
user.setEmail(cursor.getString(cursor.getColumnIndexOrThrow("user_email")));
} catch (Exception ex) {
ex.printStackTrace();
}
users.add(user);
} while (cursor.moveToNext());
}
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
cursor = null;
}
Run Code Online (Sandbox Code Playgroud)
我应该将beginTransaction,setTransactionSuccessful和endTransaction添加到读取操作中吗?我很确定我不应该,但我需要100%在这一个.
当您不使用显式事务时,SQLite将自动围绕每个语句包装事务.
当您写入数据库时,每个insert/ update/ deletecall都是一个语句.如果您正在执行多个此类操作,则使用事务来避免为每个操作支付事务开销.
查询(query或rawQuery)是单个语句,即使它返回多行.因此,围绕单个查询使用事务没有任何区别.(如果您有多个查询,则可以使用事务来确保其结果彼此一致,即使另一个线程尝试在它们之间更改数据库.)
| 归档时间: |
|
| 查看次数: |
1206 次 |
| 最近记录: |