我有以下内容解析程序查询代码:

String selection = Columns.NAME + "=? and " + Columns.AVAILABILITY + "=?";
String[] selectionArgs = { name, true };
Cursor c = getContentResolver().query(Columns.URI, null, selection, selectionArgs, null);

这段代码运行良好,因为我只有一个名称,但现在我有一个名称数组,只有在它们的可用性为true时才能添加到游标中。也就是说,我的场景是,我想把那些行放在游标中,只有当它们的可用性为真时,这些行才有任何名称(出现在数组中)。
我怎样才能做到这一点?

最佳答案

SQL具有用于此的IN operator

String selection = Columns.NAME + " IN (?,?,?) AND" +
                   Columns.Availability + " = ?";
String[] selectionArgs = { name[0], name[1], name[2], true };
...

如果数组大小不是预先确定的,则必须动态构造selection字符串和selectionArgs数组:
String selection = Columns.NAME + " IN (" + makePlaceholders(names.length) + ")" +
                   " AND " + Columns.Availability + " = ?";
String[] selectionArgs = new String[names.length + 1];
for (int i = 0; i < names.length; i++)
    selectionArgs[i] = names[i];
selectionArgs[names.length] = true;
...

使用从this answer复制的函数makePlaceholders
String makePlaceholders(int len) {
    StringBuilder sb = new StringBuilder(len * 2 - 1);
    sb.append("?");
    for (int i = 1; i < len; i++)
        sb.append(",?");
    return sb.toString();
}

07-24 09:46
查看更多