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 及其评论。