Room数据库继承数据类

问题描述 投票:0回答:1

我想知道如何在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类不能是抽象的。如何解决数据类和Room中的继承问题?

android inheritance kotlin android-room data-class
1个回答
0
投票

您可以尝试这种方式

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 ()

  • 不能让每个实体都有相同的表名。
  • 如果从数据库中检索用户对象,那么高级或免费用户将没有其他字段。
  • 如果这是您的实际用例,那么对于一个名称,id和标志为boolean的实体,如果为true,则为true;如果为false,则为自由用户;如果为true,则为premium。
  • 将继承与数据类一起使用并没有太大意义,因为它取消了它们的用途。

编辑评论中的问题答案

创建一个实体

@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应该为false。

© www.soinside.com 2019 - 2024. All rights reserved.