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
是从 SleepNightViewModel
的 later version 中调用的:
private var tonight = MutableLiveData<SleepNight?>()
init {
initializeTonight()
}
private fun initializeTonight() {
viewModelScope.launch {
tonight.value = getTonightFromDatabase()
}
}
当应用程序重新启动时,将调用 getTonightFromDatabase
来设置实例变量 tonight
(更准确地说是 latestNight
)。如果最近一晚是完整的,完整性检查将确保返回 null
,防止条目被修改。
我正在尝试理解 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
是从 SleepNightViewModel
的 later version 中调用的:
private var tonight = MutableLiveData<SleepNight?>()
init {
initializeTonight()
}
private fun initializeTonight() {
viewModelScope.launch {
tonight.value = getTonightFromDatabase()
}
}
当应用程序重新启动时,将调用 getTonightFromDatabase
来设置实例变量 tonight
(更准确地说是 latestNight
)。如果最近一晚是完整的,完整性检查将确保返回 null
,防止条目被修改。