Номер возврата котлин Кортежи из запроса - PullRequest
0 голосов
/ 16 октября 2019

Я использую базу данных номеров и хочу запросить столбец таблицы как kotlin Tuple. Может кто-нибудь помочь мне в этом же?

Итак, у меня есть таблица с именем 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>)

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Вот как вы можете этого достичь.

Создайте класс для кортежей. Включите все поля, которые вы хотите получить. В вашем случае, имя и фамилия являются полями. Эта концепция называется Возвращает подмножества столбцов .

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>

Вы получите данные, которые удовлетворяют условию запроса, с данными кортежа.

Вот как вы можете достичь этого в своем приложении.

0 голосов
/ 16 октября 2019

Вы также можете использовать вторичный конструктор в своем пользовательском классе, как показано ниже:

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
...