Комната SQLite - Как сделать SELECT, возвращающий 1 объект? - PullRequest
0 голосов
/ 21 марта 2019

Я нашел много учебных пособий по Room, но ни один из них не объясняет это.

Как выполнить запрос, возвращающий один объект, а не LiveData?

У меня есть этот методв моей комнате Дао:

@Dao
public interface TrainingDao {
    ....

    Query("SELECT * FROM " + TABLE_TRAININGS + " WHERE name =:name AND open =:open")
    Training fetchTrainingByName(String name, int open);

    ...
}

Если я запускаю этот метод в главном потоке, приложение вылетает с ошибкой «Невозможно получить доступ к базе данных в главном потоке, поскольку ...».

Итак, какможно выполнить этот запрос внутри AsyncTask, возвращая один объект обучения?

1 Ответ

0 голосов
/ 21 марта 2019

Как сказано в https://developer.android.com/training/data-storage/room/accessing-data Комната не поддерживает доступ к базе данных в главном потоке, если вы не позвонили allowMainThreadQueries().И когда вы только что вернулись Training.Вы работаете с MainThread

Итак, вы можете либо allowMainThreadQueries(), либо обернуть свой результат с помощью LiveData, как показано ниже, либо, если вам нравится RxJava, вы можете даже обернуть его в Flowable или Single* 1011.*

@Dao
public interface TrainingDao {
    ....

    Query("SELECT * FROM " + TABLE_TRAININGS + " WHERE name =:name AND open =:open")
    LiveData<Training> fetchTrainingByName(String name, int open);

    ...
}

Надеюсь, это поможет.

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