Реализуйте функцию findFirst () в абстрактном классе Дао - PullRequest
0 голосов
/ 19 ноября 2018

Я начинаю забирать Kotlin с нескольких дней.Я пытаюсь написать абстрактный класс Dao с общими функциями (copyOrUpdate, delete, ...), но я застрял на findFirst & findAll.Моя база данных - Realm.

Это часть моего Dao:

    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 голосов
/ 19 ноября 2018

Я бы пошел с расширением + встроенное веселье

inline fun <reified T : RealmModel> Realm.findFirst(): T? {
    return where(T::class.java).findFirst()
}
0 голосов
/ 19 ноября 2018

Передача 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 позволяют вам избегать или скрывать его при некоторых обстоятельствах, но не с абстрактными классами.

...