0

我的应用程序是一个琐事应用程序,我从数据库中获取问题。这个应用程序中也有一些主题,我想通过在数据库中设置一个专门用于保存与问题所属类别相对应的值的列来实现这一点。我试图导入布尔值数组列表的静态数组列表。然后我想遍历它们以根据值是否为真来创建数组(我的应用程序允许选择多个类别)。问题是将它(创建的包含主题的数组列表)合并到我的查询语句中。我想目标是这样的——如果第二列包含这些值,然后将它们添加到查询中——我认为这可能是直接 SQL 原始查询语句的孩子游戏,但它看起来令人生畏,所以我

    public Cursor getQuestions() {

    List<String> topicsList = new ArrayList<String>(39);
    for(int i = 0; i < child_check_states.size(); i++) {
        for(int j = 0; j < child_check_states.get(i).size(); j++) {
            if (child_check_states.get(i).get(j) == true) {
                topicsList.add(i+""+j+"");
            }
        }
    }
    Log.d("test", topicsList.toString());

    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.query(DB_NAME, null, null, null, null, null, "random()");
    return cursor;
}

这是题外话,不需要回答,但是这样随机化行可能存在性能问题吗?我相信我读过一次更好地实现一个使用两个游标来实现这一点的方法。我的应用程序只有 4 行用于测试,所以我没有注意到任何东西,但最终我希望有数千行。也许成千上万。

4

1 回答 1

0

只需使用“IN”关键字,例如

SELECT * from my_table where category IN (category_1, category_3, category_4)

或者,在您的示例中

public Cursor getQuestions() {

List<String> topicsList = new ArrayList<String>(39);
for(int i = 0; i < child_check_states.size(); i++) {
    for(int j = 0; j < child_check_states.get(i).size(); j++) {
        if (child_check_states.get(i).get(j) == true) {
            topicsList.add(i+""+j+"");
        }
    }
}
Log.d("test", topicsList.toString());

String replacementString = "(?";
for(int i = 1 ; i < topicsList.size(); i++){
    replacementString += ", ?";
}

replacementString += ")";

SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query(DB_NAME, <your_columns>, <category_column> IN + replacementString, topicsList.toArray(new String[topicsList.size()]), null, null, "random()");
return cursor;
于 2012-10-21T15:41:58.713 回答