SQLite-如何有效加载ID列表中包含的数据

时间:2019-06-26 04:20:55

标签: android sql database sqlite kotlin

让我们考虑以下功能

data class ModelData(var id: String?, var name: String?) {

}

fun loadData(ids: List<String>): List<ModelData> {

    // Here, I have to return list of model data which matches with ids

}

我可以用似乎效率很低的循环来做到这一点。

fun loadData(ids: List<String>): List<ModelData> {
    val list = List<ModelData>
    val selection = DBKeys.MODEL_ID + " LIKE ?"
    val selectionArgs = arrayOf<String>("")
    for (id in ids) {
        val selectionArg = arrayOf<String>(id)
        val cursor = DBManager.query(TABLE_RECORD, selection, selectionArgs, null, null, null)
        // prepare model 'data' from cursor
        list.add(data)
    }
    return list
}

我想知道还有其他有效的方法吗?如果有包含包含操作的SQLite选择查询会更好。

更新

从ADM建议的帖子中,我找到了例子,

String[] args = new String[]{A,B} // if A, B are variables
String[] args = new String[]{"A","B"}    
Cursor cur = db.query("tab1", null, "name in (?,?)", args, null, null, null);  

我想知道变量是否来自列表,有没有办法在不使用循环的情况下准备经过清理的输入?

1 个答案:

答案 0 :(得分:0)

根据注释中@ADM的提示,可以在IN数据库中使用SQLite操作。 这是一个例子,

val args = arrayOf("1", "2") // static
val cursor = db.query("records", null, "_ID in (?, ?)", args, null, null)

大多数时候,您需要从可变长度的列表中准备args。在这种情况下,您可以应用以下技巧。假设ids是需要与数据库ID匹配的字符串ID的列表。

val selection = "_ID IN (${ids.joinToString { "\"$it\"" }})"  // dynamic
val cursor = db.query("records", null, selection, null, null, null)