Android Kotlin 中的房间错误

Android Room Bug in Kotlin

我认为这是在使用 Kotlin 时 Room 中的语义问题。 Room中的简单DAO查询可以通过

获得
@Query("SELECT * FROM Users WHERE id = :id")
fun getUser(id: Int): User

虽然,我定义了return类型为User,而不是User?,但是当没有时,这个查询仍然可以returns null具有给定 id.

的用户

所以无论何时调用这个函数,你肯定需要检查null return,如下

val user = userDao.getUser("someid")
if (user != null){
    return user
}
else {
    return DEFAULT_USER
}

但是由于我们将 getUser 的 return 类型定义为 User,@kotlin 编译器建议 null 检查是 冗余 .

我错过了什么吗?有人可以对此提供一些反馈吗?

没有语义问题。如果你的函数可以return一个null,那么应该在函数中定义return类型。所以,你的函数签名应该是这样的

fun getUser(id: Int): User?

这意味着该函数可以 return null,现在您的 null 检查应该可以正常工作。

显然它已经在 Google Issue Tracker 中被跟踪 作为回应,他们的开发人员说

Status: Won't Fix (Intended Behavior)

this is not about generated code though, you are the person who creates that Query method so you should declare it as nullable.

所以,如果我们知道我们的代码可以return null,我们应该将它声明为Nullable as

@Query("SELECT * FROM Users WHERE id = :id")
fun getUser(id: Int): User?