我正在更新一些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()) {
:
}
但是在这种情况下,如何设置观察者?
答案 0 :(得分:1)
LiveData是事件流。因此,您不能使用与列表完全相同的LiveData>。例如,您可以订阅此流并像这样
处理该流中的事件packData.observe(yourActivity, Observer { words ->
if (words != null) {
for (word: Word in words) {
...
}
}
})