【问题标题】:How do I migrate from ArrayList<Object> to Android LiveData<List<Object>> from a Room database?如何从 Room 数据库从 ArrayList<Object> 迁移到 Android LiveData<List<Object>>?
【发布时间】:2019-06-20 13:32:17
【问题描述】:

我正在更新一些 Kotlin 以使用 LiveData。 来自:

    var words: ArrayList<Word> = ArrayList()
    :
    :
    for (word: Word in words) {
            createEntry(word)
    }

收件人:

    lateinit var words: LiveData<List<Word>>
    :
    words = WordRoomDatabase.getDatabase(application,scope).wordDao().getAll()
    :
    // How do I loop through all the words?

我试过了:

    for (word: Word in words) {
    }

但这失败了,因为单词没有'iterator()'方法。

    @Entity
    data class Word(
            @PrimaryKey(autoGenerate = true)
        var id: Long?,
        @NonNull
        var name: String?
        ) : Parcelable {
        constructor(parcel: Parcel) : this(
            parcel.readValue(Long::class.java.classLoader) as? Long,
            parcel.readString()
        )
        override fun writeToParcel (parcel: Parcel, flags: Int) {
        :
        :
        }
        companion object CREATOR : Parcelable.Creator<Word> {
            override fun createFromParcel(parcel: Parcel): Word{
                return Word(parcel)
            }
            override fun newArray(size: Int): Array<Word?> {
                return arrayOfNulls(size)
            }
        }
    }

在数据库世界中,我会使用游标,但是,我也不知道如何使游标与 iterator() 一起工作。我可以在DAO中声明它,但是我该如何使用呢?

    @Dao
    interface WordDao {
        @Query("SELECT * FROM Word")
        fun getAll(): LiveData<List<Word>>

        @Query("SELECT * FROM Word")
        fun getCursorAll(): LiveData<Cursor>
    }

例如如果我尝试

    words = WordRoomDatabase.getDatabase(application,scope).wordDao().getCursorAll()

我仍然收到缺少 iterator() 方法的错误。

我是否需要创建一个 iterator() 方法,或者,我怀疑更有可能, 从 Room 数据库中迭代 LiveData 的正确方法是什么?

我猜是这样的:

    val iterator = wordObserver.iteratorWithAdditions()
    while (iterator.hasNext()) {
    :
    }

但是在这种情况下,我该如何设置观察者呢?

【问题讨论】:

    标签: list arraylist kotlin android-room android-livedata


    【解决方案1】:

    LiveData 是事件流。所以你不能使用与 List 完全相同的 LiveData>。例如,您可以像这样订阅此流并处理此流中的事件

    packData.observe(yourActivity, Observer { words ->
        if (words != null) {
            for (word: Word in words) {
                ...
            }
        }
    })
    

    【讨论】:

    • 我从昨天开始一直在研究它,但我无法实施。它帮助很大!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多