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

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,则提交更改,否则回滚更改。从而保证数据一致性。

猜你喜欢

转载自blog.csdn.net/wh445306/article/details/129757633