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?
我认为这是在使用 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?