Android - как получить простой список из базы данных с помощью Room?

Я использую библиотеки компонентов в своем приложении для Android. в некоторых случаях необходимо использовать Livedata и наблюдать за их данными, но иногда я просто хочу получить какой-то обычный список, а не Livedata. Как я могу это сделать? запросить БД простым способом

p.s: я использую getValue (), но он возвращает null

0
0
1 157
2

Ответы 2

Используйте такой запрос в 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()

вы можете показать мне, как вызвать этот метод? ему нужно использовать не основной поток

faeze saghafi 17.10.2018 07:33

@faezesaghafi, пожалуйста, проверьте обновленный ответ, дайте мне знать, если все еще возникнут проблемы.

Jeel Vankhede 17.10.2018 07:44

использование Handler().post НЕ запускает автоматически его Runnable в фоновом режиме Thread

pskink 17.10.2018 08:26

Да, мне было непонятно, как работает обработчик, я сейчас. Спасибо за помощь @pskink

Jeel Vankhede 18.10.2018 07:36

Вы можете просто написать запрос в своем 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: невозможно получить доступ к базе данных в основном потоке, поскольку он потенциально может заблокировать пользовательский интерфейс на длительный период времени.

faeze saghafi 17.10.2018 08:13

В вашем Singleton-классе, где вы инициализируете YourDatabaseClass, appDatabase = Room.databaseBuilder(context, YourDatabaseClass.class, DATABASE_NAME) .allowMainThreadQueries() //Add this line .build(); Помните, это позволит выполнять запросы Room в основном потоке.

P Vartak 18.10.2018 07:20

это именно то, чего я НЕ хочу

faeze saghafi 18.10.2018 09:25

Вы должны указать это в своем Q. В любом случае вы можете использовать простой Thread или AsyncTask для достижения того же.

P Vartak 18.10.2018 09:34

Другие вопросы по теме