如何从 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) {
...
}
}
})
我正在更新一些 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) {
...
}
}
})