几天后,我开始去接Kotlin。 Atm我正在尝试编写具有常见功能(copyOrUpdate,delete,...)的抽象Dao类,但是我被困在findFirst和findAll上。 我的数据库是Realm。
这是我的一部分:
abstract class Dao<T : RealmModel>() {
//Get Realm Instance
val db: Realm by lazy {
Realm.getDefaultInstance()
}
//Delete - 1 Object
fun delete(input: T) {
if (db.isInTransaction) {
input.deleteFromRealm()
} else {
db.executeTransaction { realm -> input.deleteFromRealm() }
}
}
}
我正在努力添加findFirst()函数。我不确定这是否可行。这是不可行的斗争:
//Get First
fun findFirst(classType: T): T {
return db.where(T::class.java)
.findFirst()
}
有什么办法解决这个问题? 目前,此函数在我的UserDao类中。
class UserDao() : Dao<User>() {
//where
private fun where(): RealmQuery<User> {
return db.where<User>()
}
// Find First
fun findFirst(): User? {
return where()
.findFirst()
}
}
答案 0 :(得分:1)
我会喜欢扩展+内联乐趣
inline fun <reified T : RealmModel> Realm.findFirst(): T? {
return where(T::class.java).findFirst()
}
答案 1 :(得分:0)
将Class<T>
传递给构造函数:
abstract class Dao<T : RealmModel>(private val cls: Class<T>) {
fun findFirst(): T? {
return db.where(cls).findFirst()
}
}
class UserDao() : Dao<User>(User::class.java) { ... }
Kotlin的reified type parameters允许您在某些情况下避免或隐藏它,但对于抽象类则不允许。