使用Room按ID查询不存在的记录时,返回Flow的方法会导致应用崩溃吗?
关于Room查询无匹配数据时Flow的行为分析
你的观点不正确,当输入的topicId对应的记录不存在时,应用不会崩溃,原因如下:
Room的Flow返回规则
Room中标记@Query且返回Flow<Entity>类型的DAO方法,当查询无匹配结果时,不会抛出异常或触发崩溃,而是这个Flow不会发射任何数据。只有后续数据库中插入了匹配该topicId的记录时,Flow才会发射对应的实体数据。你的代码逻辑分析
在OfflineFirstTopicsRepository的getTopic方法中,topicDao.getTopicEntity(id).map { it.asExternalModel() }的执行逻辑是:
- 由于上游Flow没有发射任何值,
map操作根本不会执行,也就不会触发it.asExternalModel()的调用,自然不会出现空指针或其他崩溃场景。
如果希望在无数据场景下有明确的处理逻辑(比如告知上层无数据),可以修改DAO方法的返回类型为Flow<TopicEntity?>,这样查询无结果时Flow会发射null,你就能在map中对null情况做针对性处理,示例如下:
@Dao interface TopicDao { @Query("SELECT * FROM topics WHERE id = :topicId") fun getTopicEntity(topicId: String): Flow<TopicEntity?> } // 在Repository中处理null override fun getTopic(id: String): Flow<Topic?> = topicDao.getTopicEntity(id).map { it?.asExternalModel() }
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

