Я использую Room для запроса таблицы из моей локальной базы данных Android sqlite.

Я создал абстрактный класс Dao и задаюсь вопросом, могу ли я передать имя столбцов как параметры в методе следующим образом:

@Query(value = "SELECT :columnName "
        + " from " + Constant.TABLE_NAME
)
public abstract Maybe<List<SomeEntity>> getResults(String columnName);
1
issamux 31 Дек 2017 в 01:08

2 ответа

Лучший ответ

Нет, извините, это не поддерживается. Room поддерживает только то, что делает SQLite, а SQLite не поддерживает параметры для имен столбцов, имен таблиц и т. Д.

1
CommonsWare 30 Дек 2017 в 22:32

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

@Query(value = "SELECT " + Constant.COLUMN_A_NAME
        + " from " + Constant.TABLE_NAME
)
public abstract Maybe<List<SomeEntity>> getResultsFromA();

@Query(value = "SELECT " + Constant.COLUMN_B_NAME
        + " from " + Constant.TABLE_NAME
)
public abstract Maybe<List<SomeEntity>> getResultsFromB();

public Maybe<List<SomeEntity>> getResults(String columnName) {
   switch (columnName) {
     case Constant.COLUMN_A_NAME:
        return getResultsFromA();
     case Constant.COLUMN_B_NAME:
        return getResultsFromB();
     default:
        throw "Invalid Column";
   }
}

Или используйте перечисление вместо строки.

0
ThePMO 15 Апр 2020 в 07:37