【发布时间】:2020-12-05 21:11:28
【问题描述】:
execSQL 可以支持多条语句还是我应该执行单独的命令。我的用例是在事务的上下文中。
fun update(id: Long, roles: List<Role>): Int? {
val values = (roles.map { role -> "($id, ${role.id})" }).joinToString(",")
val sql = "BEGIN TRANSACTION; DELETE FROM user_role WHERE user_id = $id;" + (if (values.count() > 0) "INSERT INTO user_role(user_id, role_id) VALUES$values; " else "") + "COMMIT;"
connection.writableDatabase.execSQL(sql)
return connection.readableDatabase.rawQuery("SELECT changes()", null).use { cursor ->
return@use cursor.count
}
}
可行的替代方法如下。
fun update(id: Long, roles: List<Role>): Int? {
val values = (roles.map { role -> "($id, ${role.id})" }).joinToString(",")
connection.writableDatabase.execSQL("BEGIN TRANSACTION;")
connection.writableDatabase.execSQL("DELETE FROM user_role WHERE user_id = $id;")
if (values.count() > 0) connection.writableDatabase.execSQL("INSERT INTO user_role(user_id, role_id) VALUES$values")
connection.writableDatabase.execSQL("COMMIT")
return connection.readableDatabase.rawQuery("SELECT changes()", null).use { cursor ->
return@use cursor.count
}
}
尝试捕捉方法
fun update(id: Long, roles: List<Role>): Int? {
try {
connection.writableDatabase.execSQL("BEGIN TRANSACTION;")
connection.writableDatabase.execSQL("DELETE FROM user_role WHERE user_id = $id;")
val values = (roles.map { role -> "($id, ${role.id})" }).joinToString(",")
if (values.count() > 0) connection.writableDatabase.execSQL("INSERT INTO user_role(user_id, role_id) VALUES$values")
connection.writableDatabase.execSQL("COMMIT")
} catch(exception: Exception) {
connection.writableDatabase.execSQL("ROLLBACK")
return null
}
return connection.readableDatabase.rawQuery("SELECT changes()", null).use { cursor ->
return@use cursor.count
}
}
【问题讨论】: