【发布时间】:2020-07-28 05:42:03
【问题描述】:
我有一个 ArrayList,每当我使用 Room 更新数据库中的实时数据时都应该更新它。但是当我在更新我的列表之前和之后检查它的值时,之前的列表似乎已经更新,并且与我的列表在实际更新后显示类似的结果。这只发生在我更新子任务列时。
物品
@Entity(tableName = "items")
data class Item(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val title: String,
val subtasks: ArrayList<Subtask> = ArrayList(),
val notes: String = ""
) {
fun getDetails(): String {
var subtaskString = ""
for (subtask in subtasks) {
subtaskString += "(${subtask.title}: ${subtask.done}), "
}
return "id: ${id}\n" +
"title: ${title}\n" +
"subtasks: ${subtaskString}\n" +
"notes: ${notes}\n"
}
}
数据视图模型
val allItems: LiveData<List<Item>>
init {
allItems= itemRepository.allItems
}
fun update(item: Item) = viewModelScope.launch(Dispatchers.IO) {
itemRepository.update(item)
}
ItemRepository
val allItems: LiveData<List<Item>> = itemDao.getAllItems()
fun update(item: Item) {
itemDao.update(item)
}
ItemDao
@Query("SELECT * FROM items")
fun getAllItems(): LiveData<List<Item>>
@Update
fun update(item: Item)
我的片段
val mList= ArrayList<Item>()
dataViewModel.allItems.observe(viewLifecycleOwner, Observer { items ->
for (item in mList) {
Log.i(TAG, "Before Updating: ${item.getDetails()}")
}
mList = ArrayList(items) // update list values
for (item in mList) {
Log.i(TAG, "After Updating: ${item.getDetails()}")
}
})
这是我更新项目的例子:
// current value of subtask in database is arrayListOf(Subtask("Old Subtask", false))
val updatedSubtasks = arrayListOf(Subtask("New Subtask", false))
val item = Item(
id = id,
title = title,
subtasks = updatedSubtasks,
notes = notes
)
dataViewModel.update(item)
当我更新一个项目时,只更改了子任务列表,并将数据记录在我的列表中,它会显示以下结果:
MyFragment: Before Updating: id: 0
title: My Title
subtasks: (New Subtask, false)
notes: Note
MyFragment: After Updating: id: 0
title: My Title
subtasks: (New Subtask, false)
notes: Note
而不是:
MyFragment: Before Updating: id: 0
title: My Title
subtasks: (Old Subtask, false)
notes: Note
MyFragment: After Updating: id: 0
title: My Title
subtasks: (New Subtask, false)
notes: Note
【问题讨论】:
标签: android kotlin android-room android-livedata