SQLite - Как эффективно загружать данные, которые содержатся в списке идентификаторов - PullRequest
0 голосов
/ 26 июня 2019

Давайте рассмотрим функцию ниже,

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 голосов
/ 01 июля 2019

Согласно подсказке @ADM в комментарии, можно использовать операцию IN в базе данных SQLite. Вот пример,

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

В большинстве случаев вам нужно подготовить аргументы из списка переменной длины. В этом случае вы можете применить ниже трюк. Допустим, ids - это список строковых идентификаторов, с которыми необходимо сопоставлять идентификаторы базы данных.

val selection = "_ID IN (${ids.joinToString { "\"$it\"" }})"  // dynamic
val cursor = db.query("records", null, selection, null, null, null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...