房间从查询返回 kotlin 元组

Posted

技术标签:

【中文标题】房间从查询返回 kotlin 元组【英文标题】:Room return kotlin Tuples from query 【发布时间】:2020-02-12 20:59:59 【问题描述】:

我正在使用房间数据库,我想查询表列作为 kotlin 元组。任何人都可以帮助我吗?

所以我有一个名为 User 的表,它有多个字段,现在我想查询 2 个特定字段 first_namelast_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 元组的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Android Room 数据库删除查询问题

房间 allowMainThreadQueries 与 Kotlin 协程

从 kotlin 中的 fun 返回 null

使用带有房间的 kotlin 协程

kotlin 不确定如何处理插入方法的返回类型

添加 kotlin 协程和房间后无法进行发布构建,proguard 警告