Как перейти с ArrayList <Object>на Android LiveDataиз базы данных комнат? - PullRequest
0 голосов
/ 27 января 2019

Я обновляю некоторые Kotlin для использования LiveData.From:

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

To:

    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 ()'method.

    @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)
            }
        }
    }

В мире баз данных я бы использовал курсор, однако я не могу понять, как заставить курсоры работать с итератором ().Я могу объявить это в 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 () или, как я подозреваю, каков правильный способ перебора LiveData из базы данных Room?

Я предполагаю что-то вроде:

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

, но как в этом случае настроить Observer?

1 Ответ

0 голосов
/ 27 января 2019

LiveData - это поток событий.Таким образом, вы не можете использовать LiveData> точно так же, как List.Например, вы можете подписаться на этот поток и обрабатывать события в этом потоке следующим образом

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