sqlite rawQuery where in子句

时间:2019-07-22 08:28:22

标签: android sqlite android-sqlite

如何执行以下查询

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   参数。

2 个答案:

答案 0 :(得分:2)

您要将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())。

答案 1 :(得分:1)

您绑定了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方法。

相关问题