在抽象Dao类中实现findFirst()函数

时间:2018-11-19 11:49:44

标签: kotlin realm dao

几天后,我开始去接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()
    }
}

2 个答案:

答案 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允许您在某些情况下避免或隐藏它,但对于抽象类则不允许。