Измените наблюдаемую строку в базе данных, когда день изменился, и onCreate не был вызван - PullRequest
0 голосов
/ 18 ноября 2018

Я использую базу данных комнат с LiveData. В основной деятельности я показываю данные за текущий день. Но когда наступает новый день и onCreate не вызывается, в представлениях отображаются данные за предыдущий день. Как правильно обновить мои данные / представления в onResume?

MainActivity:

mTodayViewModel = ViewModelProviders.of(this).get(TodayDataViewModel::class.java)
    val todayDataObserver = Observer<CoffeeProductivityData> { todayData ->
        ... update views here }

    mTodayViewModel.getTodayData().observe(this, todayDataObserver)

ViewModel:

class TodayDataViewModel(application: Application) : AndroidViewModel(application) {

private val mRepository: CoffeeProductivityRepository = CoffeeProductivityRepository(application)
private val mTodayData: LiveData<CoffeeProductivityData> by lazy {
    mRepository.getTodayData()
}

fun getTodayData(): LiveData<CoffeeProductivityData> {
    return mTodayData
}}

Repository:

private var mCoffeeProductivityDao: CoffeeProductivityDao
private var mTodayData: LiveData<CoffeeProductivityData>
private var mUtilities: Utilities

init {
    val database: CoffeeProductivityDatabase = CoffeeProductivityDatabase.getDatabase(application)!!
    mCoffeeProductivityDao = database.coffeeProductivityDao()
    mUtilities = Utilities()
    mTodayData = mCoffeeProductivityDao.getTodayData(mUtilities.getTodayDate())
}

// Wrapper for getting current day data
fun getTodayData(): LiveData<CoffeeProductivityData> {
    return mTodayData
}

Запрос от DAO:

@Query("SELECT * from coffee_productivity WHERE date LIKE :todayDate")
fun getTodayData(todayDate: String): LiveData<CoffeeProductivityData>

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Я не смог сделать LiveData для правильного сброса, поэтому я перестал перезапускать активность. Я решил сделать это, потому что это довольно редкая ситуация в моем случае использования приложения. Приемник вещания зарегистрирован в деятельности onCreate и незарегистрирован в onDestroy. Вот трансляция приемника, который слушает, если дата изменилась:

    // Broadcast receiver for detecting change of day (need to refresh MainActivity)
private val mDayChangedReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == Intent.ACTION_DATE_CHANGED) {
            isActivityRefreshNeeded = true
            Log.d("mDayChangedReceiver", "Received DAY_CHANGED broadcast")
        }
    }
}

Затем я проверяю onResume MainActivity, если булево значение isActivityRefreshNeeded равно true. Если это так, я сбрасываю активность:

// If User has changed settings and navigated via back button, or day changed, refresh activity
    when (isActivityRefreshNeeded) {
        true -> {
            isActivityRefreshNeeded = false
            refreshActivity()
        }
    }

Это не лучшее решение, но, как я уже сказал, это довольно редкая ситуация, когда требуется это обновление. Если у кого-то есть лучшее решение, я буду рад его увидеть и реализовать.

0 голосов
/ 18 ноября 2018

Я думаю, что ваш лучший вариант - прослушать действие ACTION_TIME_TICK.

Вот пример: https://gist.github.com/sourabh86/6826730

Из документации:

Текущее время изменилось. Отправляется каждую минуту. Вы не можете получить это через компоненты, объявленные в манифестах, только явно зарегистрировавшись для этого с Context.registerReceiver()

if (time == midnight)
    refreshDataManually();

Проверьте этот вопрос о том, как обновить ваши LiveData вручную.

...