如何执行以下查询
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 参数。
答案 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方法。