JDBC 到 android.sqlite:SELECT/DELETE ... WHERE field IN (?)
Posted
技术标签:
【中文标题】JDBC 到 android.sqlite:SELECT/DELETE ... WHERE field IN (?)【英文标题】:JDBC to android.sqlite: SELECT/DELETE … WHERE field IN (?) 【发布时间】:2020-07-04 18:01:55 【问题描述】:我只是将一些 JDBC 代码(用于 HSQLDB)移植到 android 自己的 SQLite 实现。我有一个 sn-p,在其中我根据与我的 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();
另一个 sn-p 执行 SELECT
而不是 DELETE
并将值放在 List<String>
而不是数组中。
我将如何使用SQLiteDatabase
提供的方法来实现这一点,最好以一种不会打开任何 SQL 注入漏洞的方式?
【问题讨论】:
【参考方案1】:通过 JDBC 与 HSQLDB 一起工作的主要“成分”,即 DBMS 的 unnest()
函数,以及将数组值传递给 SQL 语句的能力,在 android.sqlite
堆栈中不可用,这使得必要的解决方法:
String[] ids = getIdsSomehow();
String whereClause = "id in (" + TextUtils.join(",", Collections.nCopies(ids.size(), "?")) + ")";
db.delete("message", whereClause, ids);
这会构建一个 where 子句 à la id in (?,?,?,?)
,并带有正确数量的问号。
对于选择,使用rawQuery()
和以相同方式构建的SELECT
语句。 List<String>
可以像这样转换为数组:
ids.toArray(new String[])
输入来自 this answer 及其 cmets。
【讨论】:
以上是关于JDBC 到 android.sqlite:SELECT/DELETE ... WHERE field IN (?)的主要内容,如果未能解决你的问题,请参考以下文章
使用存储在 android sqlite 数据库中的数据作为 weka 的输入