Room Database继承数据类

时间:2019-10-29 20:05:18

标签: android inheritance kotlin android-room data-class

我想知道如何在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中的继承问题?

1 个答案:

答案 0 :(得分: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应该为假。