【问题标题】:JDBC to android.sqlite: SELECT/DELETE … WHERE field IN (?)JDBC 到 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 注入漏洞的方式?

【问题讨论】:

    标签: android jdbc android-sqlite


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2013-08-15
      • 2011-01-21
      • 2011-04-13
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多