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 的输入

将 Android SQLite 移植到 iOS

如何将数据从 postgres 数据库导入到 android sqlite

Android--SQLite应用

Android SQLite (五 ) 全面详解

Android - SQLite - 在 Date1 和 Date2 之间选择