SQLite - как эффективно загружать данные, содержащиеся в списке идентификаторов

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

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 с операцией contains.

Обновлять

Из предложенного поста 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);  

Интересно, если переменные из списка, есть ли способ подготовить очищенный ввод без использования цикла?

Вы можете использовать SQLite IN.

ADM 26.06.2019 06:38

@ADM, не могли бы вы объяснить в ответе немного больше синтаксиса? Спасибо

Sazzad Hissain Khan 26.06.2019 06:40

Вы загружаетесь в виде списка? Почему бы не использовать адаптер курсора?

Haider Malik 26.06.2019 06:43
Здесь является примером.
ADM 26.06.2019 06:43

@HaiderMalik Нет, мне не нужно показывать в пользовательском интерфейсе. Только загрузить и обработать.

Sazzad Hissain Khan 26.06.2019 06:44

@ADM Большое спасибо. Мне все еще нужен цикл для подготовки обработанных аргументов из идентификаторов, верно?

Sazzad Hissain Khan 26.06.2019 06:44

@ADM, пожалуйста, смотрите мой обновленный пост

Sazzad Hissain Khan 26.06.2019 06:52

@ADM, твоя подсказка решает мою проблему. Вы можете опубликовать его в ответе, чтобы я мог выбрать правильный ответ.

Sazzad Hissain Khan 27.06.2019 16:08

Пожалуйста, ответьте на свой вопрос и отметьте его принятым.

ADM 30.06.2019 07:21
0
9
160
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно подсказке @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)

Другие вопросы по теме