让我们考虑以下功能
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);
我想知道变量是否来自列表,有没有办法在不使用循环的情况下准备经过清理的输入?
答案 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)