Android Room с ошибкой компиляции RxJava Single‹List‹T››

я получаю сообщение об ошибке компиляции «ошибка: не знаю, как преобразовать курсор в возвращаемый тип этого метода» при попытке выполнить запрос

Single<List<T>> getList()

но когда я меняю Single на Flowable все в порядке.

Что может быть причиной этой ошибки?


person Griill    schedule 06.09.2017    source источник
comment
Это метод DAO? Если да, то какова цель List‹T› - разве вы не знаете тип, который вы вернете на основе запроса?   -  person kenny_k    schedule 06.09.2017
comment
да метод ДАО. Список параметризован определенным типом, скажем, List‹MySpecificType›   -  person Griill    schedule 06.09.2017
comment
Конечно, но разве в аннотации @Query над этим методом не упоминается конкретная таблица или таблицы?   -  person kenny_k    schedule 06.09.2017
comment
Можете ли вы предоставить запрос, который вы используете в аннотации @Query? Я успешно использую Single<List<MyType>>, поэтому проблема должна быть связана с запросом.   -  person guillaume    schedule 08.09.2017
comment
@Query(SELECT * FROM ActiveShooter) Single‹List‹ActiveShooter›› getAllActiveShooters();   -  person Griill    schedule 09.09.2017


Ответы (1)


Да, это выдает ошибку, потому что вы наблюдаете за изменениями в базе данных.

Single создает и требует только 1 результат. Поскольку это оболочка для LiveData, которая уведомляет, как только данные были изменены, требуется использовать Flowable. Это позволяет получать данные в потоке, даже если в настоящее время нет доступных данных.

Также позаботьтесь о том, чтобы вы не использовали дженерики в создаваемых классах. это может привести к нежелательному поведению.

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

@Query("SELECT * FROM ActiveShooter") List<ActiveShooter> getAllActiveShooters(); 

и преобразуйте ваши результаты в сингл в вашем репозитории.

public void Single<List<ActiveShooter>> getActiveShooterInRepo() {
     return Single.fromCallable( () -> yourDao.getAllActiveShooters()); 
}

Если вы сделаете это, вы потеряете наблюдаемость изменений данных.

person Emanuel S    schedule 29.09.2017
comment
А теперь с room:RxJava2, нам нужно оборачивать его вручную, или достаточно написать retern type как Single‹List‹ActiveShooter›› в нашем интерфейсе DAO? И отличается ли он вообще? - person Nikita Unkovsky; 17.03.2018