安卓房间dao返回null崩溃



我试图通过在获取远程数据之前将本地数据返回到UI来实现离线优先应用程序。

这是我的代码

存储库

val trip: LiveData<DomainTrip> = Transformations.map(database.tripDao.getTrip(tripId)) {
it.asDomainModel()
}
suspend fun refreshTrip(token: String) {
withContext(Dispatchers.IO) {
val trip = webservice.getTrip(tripId, "Bearer $token").await()
database.tripDao.insertAll(trip.asDatabaseModel())
}
}

DAO

interface TripDao {
@Query("select * from databasetrip WHERE _id = :id")
fun getTrip(id: String): LiveData<DatabaseTrip>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(trip: DatabaseTrip)
}

ViewModel

private val tripRepository = TripRepository(getDatabase(application), tripId)
var trip = tripRepository.trip

如果用户正在打开一个已经存储在数据库中的旅行,上面的代码可以毫无问题地工作。一旦用户打开该行程,就会调用it.asDomainModel()。一旦从远程检索到该行程并将其保存到数据库中,就会再次调用it.asDomainModel()

我的问题是,如果用户正在打开一个不在数据库中的行程,那么当第一次调用it.asDomainModel()时,上面的代码会崩溃,it上会出现空指针异常。

更让我困惑的是,如果上面的代码被应用于这个dao查询

@Query("select * from databasetripinfo")
fun getTrips(): LiveData<List<DatabaseTripInfo>>

即使我的数据库是空的,我也不会在it.asDomainModel()的两次调用中都得到任何空指针异常。

有人能帮帮我吗?当数据库并没有空指针异常时,如何避免it.asDomainModel()上出现该异常?

thx

一切正常。如果没有给定id的项目,则实时数据将返回null。您可以在转换(it?.asDomainModel(中进行映射前检查零度

然而,对于列表,您将得到空列表而不是null(这是一种约定(。

相关内容

最新更新