我需要动态创建一个房间数据库查询,因为我在数据库中有很多UPDATE
的字段。
如果我使用下面的方法,那么它可以工作,但我有很多字段,这就是为什么我不能像这样创建一个单独的UPDATE
方法。
@Query("UPDATE PROCEDUREMODEL SET patient_in_time = :val WHERE procedure_sr_number LIKE :sr")
void updateP(String val, String sr);
现在我尝试下面,但它不工作。
在DAO类中我创建了这个
@RawQuery
ProcedureModel updateProcedure(SupportSQLiteQuery supportSQLiteQuery);
像这样使用
public static void updateProcedure(Context context, String colName, String val, String id) {
String s = "UPDATE PROCEDUREMODEL SET " + colName + " = :" + val + " WHERE procedure_sr_number LIKE :" + id;
SupportSQLiteQuery supportSQLiteQuery = new SimpleSQLiteQuery(s);
Thread thread = new Thread(() -> {
DatabaseHelper.getInstance(context).getDao().updateProcedure(supportSQLiteQuery);
});
thread.start();
}
我想在Room数据库运行时运行UPDATE
查询。
我相信你的问题是通过SQL:-
String s = "UPDATE PROCEDUREMODEL SET " + colName + " = :" + val + " WHERE procedure_sr_number LIKE :" + id;
作为值val是非数字的,因为:
id也是如此。(如果不是数字)值应该用单引号括起来。
所以使用:-
String s = "UPDATE PROCEDUREMODEL SET " + colName + " = ':" + val + "' WHERE procedure_sr_number LIKE '" + id + "'";
是可行的。尽管你很可能不需要:
作为值的一部分,所以你很可能想要:-
String s = "UPDATE PROCEDUREMODEL SET " + colName + " = '" + val + "' WHERE procedure_sr_number LIKE '" + id + "'";
表示不建议通过字符串连接应用字面值,而是建议使用参数绑定。这可以防止SQL注入。因此,您可能希望考虑以下版本:-
public static void updateProcedureBetter(Context context, String colName, String val, String id) {
String s = "UPDATE PROCEDUREMODEL SET " + colName + "=? WHERE procedure_sr_number LIKE ?";
Thread thread = new Thread(() -> {
DatabaseHelper.getInstance(context).getDao().updateProcedure(new SimpleSQLiteQuery(s,new Object[]{val,id}));
});
thread.start();
}
- 注意
?
在SQL中,这些被Object[]中的对象所取代,这些值被SQLite参数绑定正确地括起来。- 更换是1 × 1/for 1的基础(首先?替换数组中的第一个对象,第二个?通过第二个对象....)
- 还要注意中间的
supportSQLiteQuery
对象已经被取消了。 - 组件名称(表,列等)通常不能绑定/更改,因此列名必须连接。