【问题标题】:Room return kotlin Tuples from query房间从查询返回 kotlin 元组
【发布时间】: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>)

【问题讨论】:

    标签: android android-room android-architecture-components


    【解决方案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
    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 2023-01-21
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多