Android Room и LiveData: как указать пользовательскому интерфейсу или родительской таблице снова запрашивать данные при обновлении дочерней таблицы? - PullRequest
1 голос
/ 21 сентября 2019

Есть две таблицы, Task и StatisticsTask для комнаты Android, StatisticsTask имеет внешний ключ taskId для Task.id.Когда я обновляю StatisticsTask, как снова сообщить данные запроса пользовательского интерфейса?

@Entity
@Parcelize
data class Task(
    var name: String,
    var important: Boolean = false,
    var startTime: String = timeHm(),
    var endTime: String = "",
    var remind: String = "",
    var repeat: String = "",
    var repeatInterval: String = "",
    var desc: String = "",
    var endDate: String = "",
    var startDate: String = nowOfString(),
    @PrimaryKey(autoGenerate = true) var id: Int = 0
) : Parcelable {
    @Ignore
    var selected = false
    @Ignore
    var time: String? = null

    @Ignore
    var finished: Boolean = false
}
@Entity(foreignKeys = [ForeignKey(entity = Task::class, parentColumns = arrayOf("id"), childColumns = arrayOf("taskId"),
    onDelete = CASCADE)])
@Parcelize
data class StatisticsTask(
    var taskId: Int,
    var date: Calendar?,
    var finish: Boolean = false,
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0
) : Parcelable {
}
//TaskViewModel.kt

    fun finishTask(task: Task) {
        launch {
            statisticsTaskDao.updateById(task.id, !task.finished)
        }
    }

@Dao
interface StatisticsTaskDao {
    @Query("update statisticstask set finish = :finish where taskId=:taskId and date = :date")
    fun updateById(taskId: Int, finish: Boolean, date:Calendar = thisDayInitial())
}
//in my fragment
val model = ViewModelProviders.of(this)[TaskViewModel::class.java]
model.getAllOfToday().observe(this, Observer<List<Task>> {
    //udpate data to adapter
})
//I want to finish this task here(in adapter)
iv_finished.setOnClickListener {
       //task: first item in adapter
    model.finishTask(task)

       //This not work. when I finish task, how to update data again?
    model.getAllOfToday()
}

Это для android-room 2.2.0-rc1, Androidстудия 3.5.Как сообщить данные запроса базы данных снова?Я пытался вызвать это снова не работает: model.getAllOfToday (). Наблюдаем (this @ TodayFragment, Observer> {dispatchData (it)})

1 Ответ

0 голосов
/ 21 сентября 2019

Если вы используете возвращаемое значение типа LiveData в своем методе getAllOfToday, Room генерирует весь необходимый код для обновления LiveData при обновлении базы данных.

...