Класс данных наследования базы данных комнаты - PullRequest
0 голосов
/ 29 октября 2019

Мне интересно, как получить информацию о классе данных в базе данных Room. Например, есть что-то вроде этого

@Entity(tablename = "user")
abstract class User {
       var name: String,
       var id: Int
}

Теперь я хочу создать определенного пользователя, который имеет все атрибуты класса User в качестве объекта для хранения и загрузки их из базы данных

@Entity(tablename = "user")
data class FreeUser {
     override var name: String,
     override var id: Int,
     var freeUserAttirbute: String
} : User ()

и

@Entity(tablename = "user")
data class PremiumUser {
     override var name: String,
     override var id: Int,
     var premiumUserAttirbute: String
} : User ()

как DAO, я бы написал что-то вроде этого

interface UserDao {
   @Query("SELECT * FROM 'user'")
   fun getAllUser(): List<User>

Теперь, когда я строю свою прикладную комнату, он говорит мне, что класс User можетне быть абстрактнымКак я могу решить эту проблему наследования в классе данных и комнате?

1 Ответ

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

Вы можете попробовать этот способ

open class User {
       open var name: String = ""
       open var id: Int = 0
}

data class PremiumUser(
    override var name: String,
    override var id: Int,
     var premiumUserAttirbute: String
) : User()

data class FreeUser(
     override var name: String,
     override var id: Int,
     var freeUserAttirbute: String
) : User ()

  • Вы не можете иметь все объекты с одинаковыми именами таблиц.
  • Если вы извлекаете объект User из базы данных, у вас не будетдополнительные поля от Премиум или Бесплатного пользователя.
  • Если это ваш реальный вариант использования, то вам подойдет одна сущность с именем, идентификатором и флагом, которая является логической, и если значение true, то это премиум, если значение false, чемявляется свободным пользователем.

Нет особого смысла в использовании наследования с классами данных, поскольку оно отменяет их назначение.

Редактировать ответ на вопрос в комментариях

Создайте одну сущность

@Entity(tablename = "users")
data class User(
    var id: Int,
    var name: String,
    var isPremium: Boolean
)

, и DAO должна выглядеть следующим образом

interface UserDao {
   @Query("SELECT * FROM users")
   fun getAllUsers(): List<User>
}

Таким образом, вы получите всех пользователей. Если вы хотите узнать, кто является премиумом, просто проверьте, является ли поле isPremium истинным. Если пользователь бесплатный, то isPremium должно быть ложным.

...