Android内容提供程序查询IN子句

时间:2011-08-10 05:02:55

标签: android sqlite

是否可以为内容提供商使用IN子句?

我目前正在使用

cursor = contentResolver.query(CONTENT_URI, PROJECTION, "field IN (?)", new String[] { argsBuilder.toString() }, null);

如果我删除(?)并仅使用?,则会收到错误。

我在光标中得到0计数。

如果我手动输入并在sqlite3中执行查询,则可以正常工作。

帮助?

2 个答案:

答案 0 :(得分:21)

使用IN运算符时,您需要在?数组中为每个参数的逗号分隔一个selectionArgs。 E.g:

String[] selectionArgs = {"red", "black"};
String selection = "color IN (?, ?)";

以下选择正确的计数和正确的args

int argcount = 2; // number of IN arguments
String[] args = new String[]{ 1, 2 };
StringBuilder inList = new StringBuilder(argcount * 2);
for (int i = 0; i < argcount; i++) { 
    if(i > 0) {
        inList.append(",");
    }
    inList.append("?"); 
}
cursor = contentResolver.query(
   CONTENT_URI, 
   PROJECTION, 
   "field IN (" + inList.toString() + ")", 
   args, 
   null);

答案 1 :(得分:2)

如果你的论点只是数字,那么这也适用:

Iterable args = ...; // any array, list, set, ... 
cursor = contentResolver.query(CONTENT_URI, PROJECTION, "field IN (" + TextUtils.join(",", args) + ")", null, null);