如何在运行时或动态地实现Room数据库查询



我需要动态创建一个房间数据库查询,因为我在数据库中有很多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对象已经被取消了。
  • 组件名称(表,列等)通常不能绑定/更改,因此列名必须连接。

最新更新