0

我正在尝试使用 .query 而不是 .rawQuery 编写 SQL 数据库请求(我被告知它更有效,尽管并非每个人似乎都同意这一点......)。

如果我必须用 SQL 编写它,大概是这样的:

select COL_NAME, COL_COMMENTS, KEY_ROW_ID   
from TABLE   
where COL_CAT1 = myVariable1 or myVariable2 or ... myVariableN  
or COL_CAT2 = myVariable1 or myVariable2 or .... myVariableN  
or COL_CAT3 = myVariable1 or myVariable2 or.... myVariableN

我试过这个:

public Cursor findNameInTable(int myVariable1, int myVariable2, int myVariableN) {
    String where = COL_CAT1 + " = ? OR " + COL_CAT2 + "=?";
    String[] whereArgs = new String[] { Integer.toString(myVariable1), Integer.toString(myVariable2), Integer.toString(myVariableN)};
    c = myDatabase
            .query(DATABASE_TABLE, new String[] { KEY_ROWID, COL_NAME , COL_COMMENTS }, 
                    where,
                    whereArgs, null,
                    null, null);
    return c;
}

问题在于系统正在这样做:

    select .....
    from .....
    where COL_CAT1 = myVariable1 
    or COL_CAT2 = myVariable2
    or ???? = myVariableN  

然后它崩溃了,因为它希望将每个变量与一个新列进行比较,这不是我想要的:我有比列更多的输入变量。

它实际上是“=?” 这似乎不合适,但没有办法找到如何编写这种请求,大部分文档都是关于 rawQuery() 而不是 query()。提前致谢。

4

2 回答 2

1

试试这个

public Cursor findNameInTable(int myVariable1, int myVariable2, ..., int myVariableN) 
{
    String inInterval = "(?,?,?,...,?)"; // N question mark altogether.
    String where = COL_CAT1 + " IN " + inInterval 
                   + " OR " + COL_CAT2 + " IN " + inInterval
                   + ...........
                   + " OR " + COL_CATM + " IN " + inInterval;
int numberOfColumn = M; // The number of columns you have.
String[] whereArgs = new String[M * N];
for (int i = 0; i < M; i++)
{
     whereArgs[i * N + 0] = Integer.toString(myVariable1);
     whereArgs[i * N + 1] = Integer.toString(myVariable2);
     whereArgs[i * N + 2] = Integer.toString(myVariable3);
        ........................
     whereArgs[i * N + N - 1] = Integer.toString(myVariableN);
}  
Cursor c = myDatabase
        .query(DATABASE_TABLE, new String[] { KEY_ROWID, COL_NAME , COL_COMMENTS }, 
                where,
                whereArgs, null,
                null, null);
    return c;
}
于 2013-03-07T17:28:56.503 回答
0

因为您正在创建一个广泛的查询,您可能需要考虑使用:

http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html

这将允许您基本上创建更长的 where 子句。然而; 这在理论上也应该可以通过带有 StringBuilder 的 rawQuery 实现,但在最佳实践中,最好使用包装器方法。

于 2013-03-07T18:27:36.477 回答