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

时间:2019-01-27 09:55:08

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

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

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

1 个答案:

答案 0 :(得分:1)

LiveData是事件流。因此,您不能使用与列表完全相同的LiveData>。例如,您可以订阅此流并像这样

处理该流中的事件
packData.observe(yourActivity, Observer { words ->
    if (words != null) {
        for (word: Word in words) {
            ...
        }
    }
})