Intereting Posts
Как организовать методы расширения Kotlin Чистое использование Coroutines в Котлине с поддержкой тестирования модулей Ошибка DataBinding в android Spinner Когда у меня есть выбранный вид и сдвигается вниз по строке состояния, когда я поднимаю его снова, вид не выбран Как смешивать ScatterChart с горизонтальными и вертикальными линиями Когда использовать методы расширения? Как преобразовать исходный файл kotlin в исходный файл java Как я могу использовать runblocking при нажатии кнопки «Ни одна из следующих функций не может быть вызвана с аргументами, предоставленными« с топливным HTTP-протоколом » Исключение NullPointerException при попытке доступа к унаследованному полю Kotlin: нельзя использовать GenericTypeIndicator для вызова getBalue базы данных Firebase Порядок вычисления побитовых операторов в Котлине Gradle KTS. Как переместить конфигурацию зависимостей в отдельный файл из основной сборки? Кодирование запроса почтальона Как хранить данные типа reified в полях экземпляров в Kotlin?

Полный динамический запрос базы данных

У меня есть база данных с объектной монетой.

Я хочу сделать динамический запрос с параметром.

Когда я использую параметр для значения, он отлично работает, например:

@Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins") fun getAllTop(numberOfCoins: Int): Flowable<List<CoinDB>> 

Но когда я хочу использовать параметр для предложения WHERE, это не сработает. вот мой запрос:

 @Query("select * from coin ORDER BY :order asc limit :numberOfCoins") fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>> 

И я называю это так:

 AppDatabase.getInstance(this).coinDao().getAllTop("percent_change_24h",5) 

Вызов одного и того же запроса с неявным предложением WHERE работает нормально (вроде этого 🙂

 @Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins") fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>> 

Solutions Collecting From Web of "Полный динамический запрос базы данных"

Вы не можете использовать переменные связывания (параметры) для ссылки на столбцы в предложении ORDER BY. Однако вы можете использовать переменную bind в выражении:

 @Query("select * from coin ORDER BY CASE :order WHEN 'percent_change_24h' THEN percent_change_24h WHEN 'other_column_name' THEN other_column_name END asc limit :numberOfCoins") fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>> 

Вам нужно будет добавить отдельное предложение WHEN в оператор CASE для каждого столбца / выражения, которое вы хотите отсортировать, и вам может понадобиться или нужно добавить предложение ELSE для ситуаций, когда переменная привязки: порядок не соответствует ни одному из ваши стандартные случаи.

Ограничение на переменные связывания также выполняется для предложения where и проекции (выберите список). Переменная Bind имеет свои собственные значения в ваших примерах: String или Int для: order и: numberOfCoins соответственно.