Из того, что я прочитал, Room не позволяет вам вызывать запросы к базе данных в основном потоке (что может привести к задержкам в основном потоке)). поэтому представьте, что я пытаюсь обновить текстовое представление в главном потоке пользовательского интерфейса, в котором некоторые данные, как бы я получил обратный вызов. Позвольте мне показать вам пример. Представьте, что я хочу сохранить данные моей бизнес-модели в объект, называемый События. Поэтому у нас есть объект EventDao:
представьте, что у нас есть этот объект DAO ниже:
@Dao
public interface EventDao {
@Query("SELECT * FROM " + Event.TABLE_NAME + " WHERE " + Event.DATE_FIELD + " > :minDate" limit 1)
LiveData<List<Event>> getEvent(LocalDateTime minDate);
@Insert(onConflict = REPLACE)
void addEvent(Event event);
@Delete
void deleteEvent(Event event);
@Update(onConflict = REPLACE)
void updateEvent(Event event);
}
и теперь в какой-то деятельности у меня есть textview, и я бы хотел обновить его значение, поэтому я делаю это:
myTextView.setText(EventDao.getEvent(someDate));/*i think this is illegal as im trying to call room dao on mainthread, therefore how is this done correctly ? would i need to show a spinner while it updates ?*/
поскольку выборка происходит из основного потока, я не думаю, что могу назвать это так и ожидать плавного обновления. Какой лучший подход здесь?
Еще одна информация: я хотел использовать базу данных комнаты как механизм для получения информации о модели вместо того, чтобы держать ее статически в памяти. поэтому модель будет доступна мне локально через db после того, как я загружу ее через службу отдыха.
UPDATE: так как я возвращаю liveata, тогда я могу это сделать:
eventDao = eventDatabase.eventDao();
eventDao.getEvent().observe(this, event -> {
myTextView.setText(event.get(0));
});
и это работает на что-то очень маленькое. но представьте, что моя база данных содержит миллион элементов. тогда, когда я сделаю этот вызов, произойдет отмена получения данных. В первый раз, когда это вызвано, пользователю будет видно, что есть задержка. Как этого избежать? Поэтому, чтобы быть ясным, иногда мне не нужны живые данные, мне просто нужно обновить их после просмотра. Мне нужно знать, как это сделать? даже если это не с liveData.