【问题标题】:Implement a findFirst() function in abstract Dao class在抽象 Dao 类中实现 findFirst() 函数
【发布时间】:2018-11-19 11:49:43
【问题描述】:

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

【问题讨论】:

    标签: kotlin realm dao


    【解决方案1】:

    我会选择扩展+内联乐趣

    inline fun <reified T : RealmModel> Realm.findFirst(): T? {
        return where(T::class.java).findFirst()
    }
    

    【讨论】:

      【解决方案2】:

      Class&lt;T&gt; 传递给构造函数:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多