Рассмотрим ниже функцию,
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);
Интересно, если переменные из списка, есть ли способ подготовить очищенный ввод без использования цикла?
@ADM, не могли бы вы объяснить в ответе немного больше синтаксиса? Спасибо
Вы загружаетесь в виде списка? Почему бы не использовать адаптер курсора?
@HaiderMalik Нет, мне не нужно показывать в пользовательском интерфейсе. Только загрузить и обработать.
@ADM Большое спасибо. Мне все еще нужен цикл для подготовки обработанных аргументов из идентификаторов, верно?
@ADM, пожалуйста, смотрите мой обновленный пост
@ADM, твоя подсказка решает мою проблему. Вы можете опубликовать его в ответе, чтобы я мог выбрать правильный ответ.
Пожалуйста, ответьте на свой вопрос и отметьте его принятым.
Согласно подсказке @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)
Вы можете использовать
SQLite IN.