Из того, что я прочитал, Комната не позволяет вам выполнять запросы к базе данных в основном потоке (что может вызвать задержки в основном потоке). поэтому представьте, что я пытаюсь обновить текстовое представление в пользовательском интерфейсе основной поток, который содержит некоторые данные, как мне перезвонить. Позвольте мне показать вам пример. Представьте, что я хочу сохранить данные моей бизнес-модели в объекте под названием Events. Таким образом, у нас будет объект 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);
}
и теперь в некоторых действиях у меня есть текстовое представление, и я хотел бы обновить его значение, поэтому я делаю это:
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 ?*/
поскольку выборка происходит вне основного потока, я не думаю, что могу назвать это так и ожидать плавного обновления. Какой здесь лучший подход?
Еще немного информации: я хотел использовать базу данных комнат в качестве механизма для получения информации о модели вместо того, чтобы хранить ее статически в памяти. поэтому модель будет доступна мне локально через базу данных после того, как я загрузю ее через службу отдыха.
ОБНОВЛЕНИЕ: так как я возвращаю живые данные, я могу сделать это:
eventDao = eventDatabase.eventDao();
eventDao.getEvent().observe(this, event -> {
myTextView.setText(event.get(0));
});
и это работает для чего-то очень маленького. но представьте, что в моей базе данных миллион элементов. тогда, когда я сделаю этот вызов, будет задержка при получении данных. В самый первый раз, когда это будет вызвано, пользователю будет видно, что есть задержка. Как этого избежать? Чтобы быть ясным, бывают случаи, когда мне не нужны живые данные, мне просто нужно обновить представление один раз. Мне нужно знать, как это сделать? даже если это не с liveData.
LiveData
. Итак, зарегистрируйте наблюдателя за изменениями вLiveData
. Это описано в документации дляLiveData
. - person CommonsWare   schedule 31.05.2017Dao
, возвращаютFlowable
илиPublisher
, и вы подписываетесь на них, чтобы получить фактические данные. Я предполагаю, чтоLiveData
работает аналогично. До сих пор работа с Room, которую я проделал, заключалась в модификации образца, который уже использовалAsyncTask
; Я не буду играть сLiveData
еще пару недель. - person CommonsWare   schedule 31.05.2017@Query
, который не возвращаетLiveData
(например, возвращаетList<Event>
напрямую), и самостоятельно выполнять потоки (например,AsyncTask
,IntentService
,JobService
,Thread
и шину событий). - person CommonsWare   schedule 31.05.2017