Android Room Kotlin:没有数据的实体 类

Android Room Kotlin: entities with non data classes

关于 classcan/may 用于 Kotlin 房间中的实体,

  1. 是否必须使用数据classes?或者我可以使用 'normal classes',即我用于 'bussiness logic'
  2. 的那些
  3. 如果数据 classes 是强制性的:我可以在默认情况下添加功能吗?即,我可以向它们添加功能(用于他们可能需要的任何任务)吗?

documentation 没有说明将实体限制为数据 classes(尽管每个代码片段都使用数据 class)。

谢谢。

Is it mandatory to use data classes?

不,您可以混合使用任何一种。

  • 数据 classes 很方便 class

can I add functionality to what they have by default?

是的。

或许可以考虑以下几点:-

@Entity
class Table1 {
    @PrimaryKey
    var id: Long? = null
    var name: String = ""
    @Ignore
    var notAColumnInTheTable = false

    constructor(){}

    @Ignore
    constructor(name: String) {
        this.id = null
        this.name = name
        this.notAColumnInTheTable = true
    }

    fun getIdAndName(): String {
        return id.toString() + ":" + name
    }
}

和:-

@Entity
data class Table2(
    @PrimaryKey
    var id: Long? = null,
    var name: String,
    @Ignore
    var notAColumnInTheTable: Boolean = false
) {
    constructor(name: String) : this( id = null,name = name, notAColumnInTheTable = true)
    fun getIdAndName(): String {
        return id.toString() + ":" + name
    }
}

基本上是一样的

使用:-

@Dao
abstract class Table1And2Dao {
    @Insert
    abstract fun insert(table1: Table1): Long
    @Insert
    abstract fun insert(table2: Table2): Long
    @Query("SELECT * FROM table1")
    abstract fun getAllFromTable1(): List<Table1>
    @Query("SELECT * FROM table2")
    abstract fun getAllFromTable2(): List<Table2>
}
  • 注意抽象的使用 class 而不是通常看到的界面

连同合适的@Database 注释 class,在这种情况下,它具有 returns 内置数据库实例的功能,convenience/brevity 允许 运行 在主线程上。

然后使用 :-

    var db = AppDatabase.getDatabase(this)
    var dao = db.getTable1AndTable2Dao()

    dao.insert(Table1("TABLE1_1"))
    dao.insert(Table2("TABLE2_1"))
    for(t1: Table1 in dao.getAllFromTable1()) {
        Log.d("DBINFO","Name is ${t1.name} ID is ${t1.id} NotAColumnInTable is ${t1.notAColumnInTheTable} idandname = ${t1.getIdAndName()}")
    }
    for(t2: Table2 in dao.getAllFromTable2()) {
        Log.d("DBINFO","Name is ${t2.name} ID is ${t2.id} NotAColumnInTable is ${t2.notAColumnInTheTable} idandname = ${t2.getIdAndName()}")
    }

日志中的结果包括:-

D/DBINFO: Name is TABLE1_1 ID is 1 NotAColumnInTable is true idandname = 1:TABLE1_1
D/DBINFO: Name is TABLE2_1 ID is 1 NotAColumnInTable is true idandname = 1:TABLE2_1

通过应用检查:-

和:-