如何从 Room 数据库从 ArrayList<Object> 迁移到 Android LiveData<List<Object>>?

How do I migrate from ArrayList<Object> to Android LiveData<List<Object>> from a Room database?

我正在更新一些 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()) {
    :
    }

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

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

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