根据字符串数组选择数据库中的特定行

时间:2012-10-21 15:20:44

标签: android android-sqlite android-cursor

我的应用程序是一个琐事应用程序,我从数据库中收到问题。这个应用程序中还有一些主题,我想通过在数据库中有一个专门用于保存与问题类别相对应的值的列来实现这一点。我试图导入一个布尔值arraylist的静态arraylist。然后我想迭代它们来创建基于值是否为真的数组(我的应用程序允许选择多个类别)。问题是将它(创建的arraylist持有主题)合并到我的查询语句中。我想目标是这样的 - 如果第二列包含这些值,然后将它们添加到查询中 - 我认为这可能是一个直接的SQL原始查询语句的孩子玩,但是它看起来令人生畏,所以我只是让自己舒服用android替代。

    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行进行测试,所以我没有注意到任何东西,但最终我想有成千上万。也许成千上万。

1 个答案:

答案 0 :(得分:0)

只需使用&#34; IN&#34;关键字,例如

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;