Android SQLite使用事务来确保所有语句都以原子方式执行及保证数据完整性一次执行多条语句示例

54 篇文章 3 订阅
文章介绍了在Android中如何使用SQLiteDatabase的execSQL和rawQuery方法安全地执行单个SQL语句,避免分号分隔导致的SQL注入风险。推荐使用事务来确保多个语句的原子性执行,以维护数据一致性。示例代码展示了创建表、插入数据和查询的流程,并强调了异常处理和事务管理的重要性。
摘要由CSDN通过智能技术生成

execSQL 不支持用分号分隔一次执行多个 SQL 语句,虽然理论上可以实现。但是,并不建议这样做,因为这可能会导致潜在的 SQL 注入漏洞。相反,建议使用 execSQL rawQuery 分别执行每个语句。
在下面的代码块中,我们正在使用 execSQL 分别执行三个单独的 SQL 语句:创建表、向表中插入数据以及从表中查询数据。
如果需要一次执行多个语句,可以使用事务来确保所有语句都以原子方式执行。以下是一个示例:

SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("test.db", null);

try {
    db.beginTransaction();

    db.execSQL("CREATE TABLE IF NOT EXISTS user(" +
            "id INTEGER PRIMARY KEY AUTOINCREMENT," +
            "name TEXT," +
            "age INTEGER)");

    db.execSQL("INSERT INTO user(name, age) VALUES('Tom', 18)");

    Cursor cursor = db.rawQuery("SELECT * FROM user", null);
    while (cursor.moveToNext()) {
        int id = cursor.getInt(cursor.getColumnIndex("id"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        Log.d("TAG", "id: " + id + ", name: " + name + ", age: " + age);
    }
    cursor.close();

    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
    db.close();
}

 说明:

在此示例中,所有三个 SQL 语句都在同一个事务内执行。
beginTransaction 方法开始事务,
setTransactionSuccessful 方法将事务标记为成功。
如果在调用 setTransactionSuccessful 之前抛出异常,则事务会自动回滚。
endTransaction 方法结束事务,
如果调用了 setTransactionSuccessful,则提交更改,否则回滚更改。从而保证数据一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值