Android Room Kotlin:没有数据的实体 类
Android Room Kotlin: entities with non data classes
关于 classcan/may 用于 Kotlin 房间中的实体,
- 是否必须使用数据classes?或者我可以使用 'normal classes',即我用于 'bussiness logic'
的那些
- 如果数据 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
通过应用检查:-
和:-
关于 classcan/may 用于 Kotlin 房间中的实体,
- 是否必须使用数据classes?或者我可以使用 'normal classes',即我用于 'bussiness logic' 的那些
- 如果数据 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
通过应用检查:-
和:-