Android Kotlin Room 代码实验室中 getTonightFromDatabase() 的用途是什么?

What is the purpose of getTonightFromDatabase() in the Android Kotlin Room codelabs?

我正在尝试理解 Android Kotlin 基础知识中的代码实验室 6.2 Coroutines and Room。 Class SleepTrackerViewModel 包括(我添加的评论):

private var tonight = MutableLiveData<SleepNight?>()

private suspend fun getTonightFromDatabase(): SleepNight? {
    var night = database.getTonight()  // this gets the most recent night
    // Return null if this night has been completed (its end time has been set).
    if (night?.endTimeMilli != night?.startTimeMilli) {
        night = null
    }
    return night
}

fun onStartTracking() {
    viewModelScope.launch {
        val newNight = SleepNight()
        insert(newNight)
        tonight.value = getTonightFromDatabase()
    }
}

fun onStopTracking() {
    viewModelScope.launch {
        val oldNight = tonight.value ?: return@launch
        oldNight.endTimeMilli = System.currentTimeMillis()
        update(oldNight)
    }
}

我不明白为什么需要仅从 onStartTracking() 调用的方法 getTonightFromDatabase()onStartTracking() 中的最后一条语句似乎可以替换为:

tonight.value = newNight

我也不明白为什么需要 getTonightFromDatabase() 中的条件。

原因之一是 SleepNight 数据 class 中的 nightId 是由 SQL 自动生成的。

如果代码可以执行 tonight.value = newNight,那么 nightId 将与数据库中的代码不同。这将导致 onStopTracking 中的 update 调用在错误的夜晚结束 (update)。

另请注意,方法 getTonightFromDatabase 是从 SleepNightViewModellater version 中调用的:

private var tonight = MutableLiveData<SleepNight?>()

init {
    initializeTonight()
}

private fun initializeTonight() {
   viewModelScope.launch {
       tonight.value = getTonightFromDatabase()
   }
}

当应用程序重新启动时,将调用 getTonightFromDatabase 来设置实例变量 tonight(更准确地说是 latestNight)。如果最近一晚是完整的,完整性检查将确保返回 null,防止条目被修改。