Комната настраивается пользователем по запросам - PullRequest
0 голосов
/ 30 апреля 2018

Я перевожу приложение для использования Room из обычного Sqlite, и у меня возникли проблемы с тем, что есть несколько запросов с оператором упорядочения по словам, которые настраиваются пользователем, то есть они могут изменить то, как они хочу просмотреть список заказов.

То, что кажется, что Комната не допускает динамический порядок по операторам, поэтому мне пришлось бы делать отдельные запросы специфичными для каждого заказа по операторам.

Кто-нибудь нашел лучший способ обойти эту проблему, чтобы я мог иметь 1 оператор запроса, где единственное, что меняется, - это порядок по предложению против необходимости писать, что в моем случае было бы примерно 15 дополнительными операторами запроса, в основном одинаковыми?

Ответы [ 4 ]

0 голосов
/ 25 января 2019

Как tyczj уже предложил, вы можете нам RawQuery. Кроме того, SimpleSQLiteQuery также можно перемещать в DAO, поэтому за пределами DAO нет операторов SQL.

DAO также может быть определен через абстрактный класс. Это позволяет вам добавить метод, который выполняет SimpleSQLiteQuery.

Пример:

@DAO
public abstract class UserDao {

    @RawQuery
    public abstract List<User> getUsersViaRawQuery(SupportSQLiteQuery query);

    public List<User> getUsersOrderBy(String column) {
        String statement = "SELECT * FROM user ORDER BY " + column + " ASC";
        SupportSQLiteQuery query = new SimpleSQLiteQuery(statement, new Object[]{});
        return getUsersViaRawQuery(query);
    }

}

Параметр столбца также можно заменить перечислением, которое допускает только определенные значения.

Пример:

private static String createOrderByString(Order order) {
    switch (order) {
        case NAME:
            return "ORDER BY first_name ASC, last_name ASC";
        case AGE:
            return "ORDER BY age DESC";
        default:
            return "";
    }
}
0 голосов
/ 04 мая 2018

Я столкнулся с той же проблемой прямо сейчас. Что можно сделать, это использовать CASE:

SELECT * FROM Table
ORDER BY 
CASE WHEN :parameter = 1 THEN Column END ASC,
CASE WHEN :parameter = 2 THEN Column2 END DESC

Но я предполагаю, что вы также используете ViewModel, поэтому вам, вероятно, придется каждый раз заново инициализировать его. Я думаю, что этот способ немного лучше, чем написание 15 запросов, возможно, не такой компактный.

Этот ответ также имеет хороший пример, но я верю, что логика обратная.

0 голосов
/ 09 мая 2018

В комнате 1.1 теперь есть RawQuery, который можно использовать для решения этой проблемы

 @Dao
 interface RawDao {
     @RawQuery
     User getUserViaQuery(SupportSQLiteQuery query);
 }
 SimpleSQLiteQuery query = new SimpleSQLiteQuery("SELECT * FROM User WHERE id = ? LIMIT 1",
         new Object[]{userId});
 User user2 = rawDao.getUserViaQuery(query);

https://developer.android.com/reference/android/arch/persistence/room/RawQuery

0 голосов
/ 03 мая 2018

Вы не можете использовать параметры в методе Нашего Дао.

@Query("SELECT * FROM sometable order by :orderClause DESC")
    List<Islem> findOneUserName(String orderClause);//didn't work

Параметры этого запроса используются только в тех случаях, когда необходимо избежать инъекций Sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...