使用括号和?在Android SQLiteDatabase中查询()

时间:2015-05-21 05:38:59

标签: android mysql

我正在尝试使用query()函数在Android上的SQLiteDatabase上执行查询。我想在SelectionArgs []中传递参数,但是当我使用IN语句时,它似乎不能替换'?'用正确的论点。

我的查询如下:

temp = database.query(TABLE_NAME_ENTRIES, 
                new String[] {"_id", "Entry", "Summary"}, 
                "_id IN ( ? )",
                new String[] {ids}, null, null, null);

它会导致一个空的Cursor。 Debug给出了执行查询使用语句“_id IN(?)”的信息,表明它似乎没有替换'?'正如所料。当我将查询更改为

temp = database.query(TABLE_NAME_ENTRIES, 
                new String[] {"_id", "Entry", "Summary"}, 
                "_id IN ( " + ids + " )",
                null, null, null, null);

相反,我得到了预期的结果。

我真的很愚蠢这个问题,任何想法我做错了什么?

1 个答案:

答案 0 :(得分:0)

您可以使用这样的解决方法 - 创建一个方法,使用?,动态生成您的字符串,并将其放入查询中,如下所示:

String[] ids = { "id1", "id2" }; // do whatever is needed first
String query = "SELECT * FROM table"
+ " WHERE _id IN (" + makePlaceholders(ids.length) + ")";
Cursor cursor = mDb.rawQuery(query, ids);


String makePlaceholders(int len) {
    if (len < 1) {
        // It will lead to an invalid query anyway ..
       throw new RuntimeException("No placeholders");
    } else {
        StringBuilder sb = new StringBuilder(len * 2 - 1);
        sb.append("?");
        for (int i = 1; i < len; i++) {
            sb.append(",?");
        }
        return sb.toString();
    }
}

P.S。我认为你的查询中问号前后的空格可能是错误的,但我没有测试它,所以我无法100%确定