微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android SQLite:我应该只在插入或插入和读取查询时使用beginTransaction和endTransaction吗?

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();
}

但是当我从数据库中读取时,我不使用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;
}

我应该将beginTransaction,setTransactionSuccessful和endTransaction添加到读取操作中吗?我很确定我不应该,但我需要100%在这一个.

解决方法:

当您不使用显式事务时,SQLite将自动围绕每个语句包装事务.

写入数据库时​​,每个插入/更新/删除调用都是一个语句.
如果您正在执行多个此类操作,则使用事务来避免为每个操作支付事务开销.

查询(query或rawQuery)是单个语句,即使它返回多行.
因此,围绕单个查询使用事务没有任何区别.
(如果您有多个查询,则可以使用事务来确保其结果彼此一致,即使另一个线程尝试在它们之间更改数据库.)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐