JDBC 到 android.sqlite:SELECT/DELETE … WHERE 字段在 (?)
JDBC to android.sqlite: SELECT/DELETE … WHERE field IN (?)
我只是将一些 JDBC 代码(用于 HSQLDB)移植到 Android 自己的 SQLite 实现。我有一个片段,其中我根据与 Java 代码中 String[]
数组中的值之一匹配的特定字段删除记录。
这是 DELETE
语句的 JDBC 代码:
String[] ids = getIdsSomehow();
PreparedStatement stmtD = db.prepareStatement("delete from message where id in (unnest(?))");
Array delIdArray = stmtD.getConnection().createArrayOf("VARCHAR", ids);
stmtD.setArray(1, delIdArray);
stmtD.execute();
stmtD.close();
另一个代码片段执行 SELECT
而不是 DELETE
并且在 List<String>
而不是数组中具有值。
我如何使用 SQLiteDatabase
提供的方法来完成此操作,最好是以不会打开任何 SQL 注入漏洞的方式?
使 HSQLDB 在 JDBC 上工作的主要“成分”,即 DBMS 的 unnest()
功能,以及将数组值传递给 SQL 语句,不适用于 android.sqlite
堆栈,因此需要解决方法:
String[] ids = getIdsSomehow();
String whereClause = "id in (" + TextUtils.join(",", Collections.nCopies(ids.size(), "?")) + ")";
db.delete("message", whereClause, ids);
这将构建一个带有正确数量问号的 id in (?,?,?,?)
where 子句。
对于选择,使用 rawQuery()
和以相同方式构建的 SELECT
语句。 List<String>
可以转换成这样的数组:
ids.toArray(new String[]{})
输入来自 this answer 及其评论。
我只是将一些 JDBC 代码(用于 HSQLDB)移植到 Android 自己的 SQLite 实现。我有一个片段,其中我根据与 Java 代码中 String[]
数组中的值之一匹配的特定字段删除记录。
这是 DELETE
语句的 JDBC 代码:
String[] ids = getIdsSomehow();
PreparedStatement stmtD = db.prepareStatement("delete from message where id in (unnest(?))");
Array delIdArray = stmtD.getConnection().createArrayOf("VARCHAR", ids);
stmtD.setArray(1, delIdArray);
stmtD.execute();
stmtD.close();
另一个代码片段执行 SELECT
而不是 DELETE
并且在 List<String>
而不是数组中具有值。
我如何使用 SQLiteDatabase
提供的方法来完成此操作,最好是以不会打开任何 SQL 注入漏洞的方式?
使 HSQLDB 在 JDBC 上工作的主要“成分”,即 DBMS 的 unnest()
功能,以及将数组值传递给 SQL 语句,不适用于 android.sqlite
堆栈,因此需要解决方法:
String[] ids = getIdsSomehow();
String whereClause = "id in (" + TextUtils.join(",", Collections.nCopies(ids.size(), "?")) + ")";
db.delete("message", whereClause, ids);
这将构建一个带有正确数量问号的 id in (?,?,?,?)
where 子句。
对于选择,使用 rawQuery()
和以相同方式构建的 SELECT
语句。 List<String>
可以转换成这样的数组:
ids.toArray(new String[]{})
输入来自 this answer 及其评论。