Я использую библиотеки компонентов в своем приложении для Android. в некоторых случаях необходимо использовать Livedata и наблюдать за их данными, но иногда я просто хочу получить какой-то обычный список, а не Livedata. Как я могу это сделать? запросить БД простым способом
p.s: я использую getValue (), но он возвращает null
Используйте такой запрос в DAO:
@Query("SELECT * FROM TABLE_NAME")
fun getListOfData(): List<Data>?
это предоставит вам список данных из вашей таблицы, как и запрос выбора, переданный в параметре @Query.
Редактировать:
При вызове из основной поток вы можете использовать обработчик для выполнения своей работы в фоновом режиме, как показано ниже:
//Method from where you want your data from Db.
fun getMyList() {
Thread {
(your db object).(your dao).getListOfData()
}.start()
}
или вы можете разрешить выполнение вашей базы данных в основном потоке при создании базы данных вашей комнаты, как показано ниже (Хотя я бы не рекомендовал это):
Room.databaseBuilder(
...
)
.allowMainThreadQueries()
.build()
@faezesaghafi, пожалуйста, проверьте обновленный ответ, дайте мне знать, если все еще возникнут проблемы.
использование Handler().post НЕ запускает автоматически его Runnable в фоновом режиме Thread
Да, мне было непонятно, как работает обработчик, я сейчас. Спасибо за помощь @pskink
Вы можете просто написать запрос в своем Dao, который имеет тип возвращаемого значения как List, и вызвать из вашей ViewModel, где вам нужны эти данные.
Пример :
// YourDao
@Query("SELECT * FROM YourTable")
List<YourModel> getAllYourTableData();
// YourRepo
public static List<YourModel> getAllData(){
return getYourModelDao.getAllYourTableData();
}
// Ваша ViewModel
public void someFunctionWhereYouNeedNormalData(){
//assign to list
YourRepo.getAllData();
}
Предполагая, что у вас есть знания о шаблоне репо в компонентах арки Android.
IllegalStateException: невозможно получить доступ к базе данных в основном потоке, поскольку он потенциально может заблокировать пользовательский интерфейс на длительный период времени.
В вашем Singleton-классе, где вы инициализируете YourDatabaseClass, appDatabase = Room.databaseBuilder(context, YourDatabaseClass.class, DATABASE_NAME) .allowMainThreadQueries() //Add this line .build(); Помните, это позволит выполнять запросы Room в основном потоке.
это именно то, чего я НЕ хочу
Вы должны указать это в своем Q. В любом случае вы можете использовать простой Thread или AsyncTask для достижения того же.
вы можете показать мне, как вызвать этот метод? ему нужно использовать не основной поток