房间从查询返回 kotlin 元组
Posted
技术标签:
【中文标题】房间从查询返回 kotlin 元组【英文标题】:Room return kotlin Tuples from query 【发布时间】:2020-02-12 20:59:59 【问题描述】:我正在使用房间数据库,我想查询表列作为 kotlin 元组。任何人都可以帮助我吗?
所以我有一个名为 User
的表,它有多个字段,现在我想查询 2 个特定字段 first_name
和 last_name
和 Kotlin Tuples(Pair)
@Entity(tableName = "user")
data class User(
var id: String,
var first_name: String,
var last_name: String
// some other fields
)
@Dao
interface UserDao
@Query("SELECT first_name as first, last_name as second FROM user WHERE id = :id")
fun getUserName(id: String): Pair<String, String>
我收到如下编译器错误:
Not sure how to convert a Cursor to this method's return type (kotlin.Pair<java.lang.String,java.lang.String>)
【问题讨论】:
【参考方案1】:这就是你实现它的方法。
为元组创建类。包括您想要获取的所有字段。在您的情况下,名字和姓氏是字段。这个概念称为返回列的子集。
UserNameTuple
data class UserNameTuple(
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
这样设计查询:
@Query("SELECT first_name, last_name FROM user WHERE id = :id")
fun getUserName(id: String): List<UserNameTuple>
您将通过元组数据获得满足查询条件的数据。
这就是您可以在您的应用程序中实现它的方法。
【讨论】:
我知道这个解决方案,这需要我为查询结果创建额外的data class
。这就是我尝试使用 kotlin Pair
实现的原因。关于如何实现相同的任何建议?
不,我没有其他解决方案。这是我猜的唯一解决方案。
这是唯一的解决方案。【参考方案2】:
您还可以在用户类中使用辅助构造函数,如下所示:
constructor(first_name: String, last_name: String) : this("", first_name, last_name)
或者既然你有更多的字段,那么你可以使用默认值来避免像下面这样的二级构造函数[我放了“”,你可以根据你的要求改变它]:
data class User(
var id: String = "",
var first_name: String = "",
var last_name: String = ""
// some other fields
)
并像这样修改getUserName
@Query("SELECT first_name, last_name FROM user WHERE id = :id")
fun getUserName(id: String): User
【讨论】:
我试图避免将整个User
对象重新调整给 getUserName
的使用者。关于如何使用Pair
作为返回类型的任何其他建议?
您不能使用配对。您必须使用用户或创建一个新模型。根据文档:Room allows you to return any Java-based object from your queries as long as the set of result columns can be mapped into the returned object. For example, you can create plain old Java-based object (POJO) to fetch the user's first name and last name
以上是关于房间从查询返回 kotlin 元组的主要内容,如果未能解决你的问题,请参考以下文章