Android 房间返回来自查询的kotlin元组

Android 房间返回来自查询的kotlin元组,android,android-room,android-architecture-components,Android,Android Room,Android Architecture Components,我使用的是room数据库,我想以kotlin元组的形式查询表列。有人能帮我吗 因此,我有一个名为User的表,它有多个字段,现在我想查询两个特定字段first\u name和last\u name和Kotlin元组(成对) @实体(tableName=“user”) 数据类用户( 变量id:String, 变量名:String, 变量姓氏:字符串 //其他一些领域 ) @刀 接口用户DAO{ @查询(“从用户中选择first\u name作为first,last\u name作为second,

我使用的是room数据库,我想以kotlin元组的形式查询表列。有人能帮我吗

因此,我有一个名为
User
的表,它有多个字段,现在我想查询两个特定字段
first\u name
last\u name
和Kotlin元组(成对)


@实体(tableName=“user”)
数据类用户(
变量id:String,
变量名:String,
变量姓氏:字符串
//其他一些领域
)
@刀
接口用户DAO{
@查询(“从用户中选择first\u name作为first,last\u name作为second,其中id=:id”)
有趣的getUserName(id:String):配对
}
我得到一个编译器错误,如下所示:

Not sure how to convert a Cursor to this method's return type (kotlin.Pair<java.lang.String,java.lang.String>)
constructor(first_name: String, last_name: String) : this("", first_name, last_name)
不确定如何将游标转换为此方法的返回类型(kotlin.Pair)

这就是您可以实现它的方法

为元组创建类。包括您要获取的所有字段。在您的情况下,名字和姓氏是字段。这一概念称为返回列的子集

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>
@Query(“从id=:id的用户中选择名字和姓氏”)
fun getUserName(id:String):列表
您将使用元组数据获得满足查询条件的数据


这是在应用程序中实现它的方法。

这是实现它的方法

为元组创建类。包括您要获取的所有字段。在您的情况下,名字和姓氏是字段。这一概念称为返回列的子集

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>
@Query(“从id=:id的用户中选择名字和姓氏”)
fun getUserName(id:String):列表
您将使用元组数据获得满足查询条件的数据


这就是如何在应用程序中实现它的方法。

您也可以在用户类中使用二级构造函数,如下所示:

Not sure how to convert a Cursor to this method's return type (kotlin.Pair<java.lang.String,java.lang.String>)
constructor(first_name: String, last_name: String) : this("", first_name, last_name)
或者,因为您有更多字段,所以可以使用默认值来避免使用下面的二级构造函数[I put“”,您可以根据需要更改它]:

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

您还可以在用户类中使用二级构造函数,如下所示:

Not sure how to convert a Cursor to this method's return type (kotlin.Pair<java.lang.String,java.lang.String>)
constructor(first_name: String, last_name: String) : this("", first_name, last_name)
或者,因为您有更多字段,所以可以使用默认值来避免使用下面的二级构造函数[I put“”,您可以根据需要更改它]:

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
作为返回类型,还有其他建议吗?您不能使用Pair。您必须使用用户或创建新模型。根据Doc:
Room允许您从查询中返回任何基于Java的对象,只要结果列集可以映射到返回的对象中。例如,您可以创建普通的基于Java的旧对象(POJO)来获取用户的名字和姓氏
我试图避免将整个
用户
对象重新调谐到
getUserName
的使用者。对于如何使用
Pair
作为返回类型,还有其他建议吗?您不能使用Pair。您必须使用用户或创建新模型。根据Doc:
Room允许您从查询中返回任何基于Java的对象,只要结果列集可以映射到返回的对象中。例如,您可以创建普通的基于Java的旧对象(POJO)来获取用户的名字和姓氏
我知道这个解决方案,这将需要我为查询结果创建额外的
数据类
。这就是我试图使用kotlin
Pair
实现的原因。有没有关于如何实现同样目标的建议?没有,我没有其他解决方案。我想这是唯一的解决方案。这是唯一的解决方案。我知道这个解决方案,这将需要我为查询结果创建额外的
数据类。这就是我试图使用kotlin
Pair
实现的原因。有没有关于如何实现同样目标的建议?没有,我没有其他解决方案。我想这是唯一的解决办法。这是唯一的解决办法。