【问题标题】:sqlite rawQuery where in clausesqlite rawQuery where in 子句
【发布时间】:2019-07-22 08:28:22
【问题描述】:

如何执行下面的查询

select * from regions where field1 in('word1', 'word2')

使用 sqlite rawQuery 方法?

我试过下面的代码:

String[] myArray = new String[]{"word1","word2"};
Cursor cursor = mDb.rawQuery("select * from regions where field1 in(?)", myArray );

但错误:

原因:java.lang.IllegalArgumentException:无法在以下位置绑定参数 索引 2,因为索引超出范围。该声明有 1 参数。

【问题讨论】:

  • 创建一个逗号分隔的字符串并将其传递给 IN
  • 签出,this可能重复

标签: java android sqlite android-sqlite


【解决方案1】:

您将 2 个参数传递给 rawQuery()"word1""word2",但 sql 语句仅包含 1 个占位符 ?
将其更改为:

Cursor cursor = mDb.rawQuery("select * from regions where field1 in(?, ?)", myArray );

编辑。
如果要传递未知数量的参数,则必须在 in 内构造逗号分隔的参数,并仅使用 rawQuery() 的第一个参数:

String[] myArray = new String[]{"word1","word2"};
StringBuilder sb = new StringBuilder("'");
for (String word : myArray) {
    sb.append(word.replace("'", "''")).append("','");
}
if (sb.length() > 1) {
    sb.setLength(sb.length() - 2);
}
Cursor cursor = mDb.rawQuery("select * from regions where field1 in (" + sb.toString() + ")", null);

这不是一个安全的解决方案,您必须正确准备数组的项目,以免它们包含单引号(这就是我使用 replace() 的原因)。

【讨论】:

  • myArray 的元素数量未知
  • 你不能这样通过。数组的每一项都必须有一个对应的占位符。请参阅我编辑的答案。
  • 强烈建议不要传话。构建占位符列表就足够了。
  • 谢谢。它有一个简单的问题,字符串生成器正在生成类似这样的内容:“'word1',word2'”。它在第二个元素之前需要一个逗号。
【解决方案2】:

您绑定了 2 个参数,但您的查询只有一个占位符。 如果你不知道先验的数字,你可以这样做:

String inContent = String.join("", Collections.nCopies(myArray.length-1, "?,")).concat("?");
Cursor cursor = mDb.rawQuery("select * from regions where field1 in(" + inContent + ")", myArray );

您只是在编写一个带有由逗号分隔的 array.length 占位符的查询。记得导入 java.util.*。为了使用集合。这种方法是安全的,因为您不会在查询中传递用户字符串。

如果你使用java11,你可以使用String::repeat方法。

【讨论】:

  • 是的,我给你写了一条评论,说明了原因,但我不认为我的回答是最好的争论点。
  • 我写了一条评论,我解释了这一点,所以如果您不同意,请回复评论。
  • 是的,我读过但写了“这不是一个安全的解决方案”,我认为这不是一个好的解决方案,所以这就是我投票不足的原因,你可以同意或不同意,但这是我的意见。
  • 您的第一个解决方案使用String.join(),它需要 API 级别 26。您甚至没有尝试过吗?
  • “重点是‘使用这种方法’而不是‘使用这种代码’的哪一部分不清楚?
猜你喜欢
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2011-05-16
相关资源
最近更新 更多