Intereting Posts
Как удалить повторяющиеся ключи, предварительный просмотр пользовательской клавиатуры Android Активность с прозрачным фоном После обновления до Android Studio 2.3 невозможно разрешить символ GoogleAccountCredential Повторный запрос разрешения после изменения ориентации Recycliewiew мучительно медленно загружает кешированные изображения из Picasso Intent URI для запуска приложения Gmail Как вы переопределяете модуль / зависимость в модульном тесте с Dagger 2.0? Обнаружение за VPN в Android Android: профиль GATT с низким энергопотреблением Bluetooth OnLongClickListener не работает в WebView Нужен пример о RecyclerView.Adapter.notifyItemChanged (int position, полезная нагрузка Object) Android: кнопка редактирования текста Как записывать все сенсорные и акселерометры на устройстве Android во ВСЕХ приложениях Разница между базовым контекстом, контекстом приложения и контекстом активности Как переименовать файлы в Android Studio

Номер Android: заказ Не работает

Я использую новый номер ORM для Android. И я столкнулся с проблемой. ORDER BY с аргументами не работает. Если я хочу использовать поле из параметра для ORDER BY, это не работает. Ничего не нарушал.

@Query("SELECT * FROM User ORDER BY :orderBY ASC") List<User> sortedFind(String orderBY); 

Но, когда я помещаю прямо в какое поле для сортировки, он работает, как ожидалось.

 @Query("SELECT * FROM User ORDER BY name ASC") List<User> sortedFind(); 

Это ошибка в комнате Android, или я делаю что-то неправильно?

    Что происходит

    Единственными значениями, которые вы можете передать в качестве параметров для методов @Dao являются значения, а не строки запроса. Причиной этого (я верю) является предотвращение проблем с SQL-инъекциями.

    Почему это так

    Например, запрос SELECT * emails WHERE uid = ? Затем установите значение как "1 OR WHERE isAdmin = true" . Это позволит людям запускать собственные запросы на основе вашей базы данных и делать то, что они хотят.

    Мое решение

    Я столкнулся с этой проблемой. Вот ссылка на мое решение .

    Мое решение состоит из двух частей. Первый DynamicQueryservice который генерирует строку запроса и массив значений на основе ввода, затем запускает необработанный запрос и возвращает Cursor . Во-вторых, Cursor2POJO mapper, поэтому мне не нужно много раз Cursor2POJO отображения курсоров для классов, а также не вводить потенциальные проблемы обслуживания. Я просто добавляю аннотации к моим классам (которые соответствуют именам столбцов комнаты), а lib обрабатывает остальные.

    Я разделил свой Cursor mapper на свой собственный lib для вашей выгоды, не стесняйтесь использовать его (просто сделал это так, если readme не ясен, или ошибки попали мне в комментарии).

    PS Моя библиотека не может использовать Room @ColumnInfo для получения имен столбцов, поскольку в настоящее время аннотирование задано как RetentionPolicy.CLASS, поэтому невозможно получить доступ через отражение. (Добавлен в трекер google https://issuetracker.google.com/issues/63720940 )