Я делаю приложение, которое использует пространство и Livedata для хранения и отображения данных, я могу создавать и удалять отдельные элементы без проблем, но я изо всех сил пытаюсь создать процесс для обновления значений.
Проблема в том, что мне нужно получить доступ к объекту, связанному с объектом LiveData, за пределами наблюдателя, чтобы изменить значения объекта и обновить его с помощью модели представления, но когда я пытаюсь использовать LiveData.value, я всегда получаю нулевое значение за пределами наблюдателя и действительный объект внутри наблюдателя (я показываю это, используя тост и перекус, как вы можете видеть в коде ниже).
Итак, как я могу получить доступ или обновить объект, связанный с LiveData вне наблюдателя?
if(intent.hasExtra("MEDICINE_ID")){
title = getString(R.string.editar_medicamento)
medicamentoActualLive = medicamentoViewModel.getMedicamento(intent.getIntExtra("MEDICINE_ID",-1))
medicamentoActualLive.observe(this, android.arch.lifecycle.Observer {
CampoNombreComercial.setText(it!!.nombreMedicamento,TextView.BufferType.EDITABLE)
CampoNombreGenerico.setText(it!!.nombreGenerico,TextView.BufferType.EDITABLE)
CampoDosis.setText(it!!.dosis,TextView.BufferType.EDITABLE)
CampoNota.setText(it!!.nota,TextView.BufferType.EDITABLE)
val MedicineTypeIndex = this.resources.getStringArray(R.array.TipoMedicamento).indexOf(it!!.tipo)
SpinnerTipoMedicamento.setSelection(MedicineTypeIndex)
MedicamentoIconoTV.setColorFilter(it.color!!)
mCurrentPhotoPath = it.fotografia!!
displayPic()
medicamento = it
Toast.makeText(this@AnadirMedicamentoActivity,"El valor del medicamento live es: " + medicamento.nombreGenerico, Toast.LENGTH_SHORT).show()
})
Snackbar.make(LayoutConstrain,"El valor del medicamento live externo: " + medicamentoActualLive.value?.nombreGenerico, Snackbar.LENGTH_SHORT).show()
}else{
title = getString(R.string.AnadirMedicamento)
}
Процесс сохранения или обновления выполняется в этой функции, вызываемой в методе onClick кнопки с плавающим действием:
private fun saveMedicineToDB(medicamento: Medicamento){
if(intent.hasExtra("USER_ID")){
medicamentoViewModel.update(medicamento)
}else{
medicamentoViewModel.insert(medicamento)
}
setResult(Activity.RESULT_OK)
finish()
}
Я нашел решение этой проблемы, так как в комментариях говорится, что я не могу получить доступ к данным объекта LiveData из-за асинхронного запроса, но я могу получить доступ из события пользовательского интерфейса (в данном случае это событие onClick). Это мое решение:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val establecimiento : Establecimiento
if(intent.hasExtra("ESTABLISHMENT_ID")){
establecimiento = establecimientoActualLive.value!!
}else{
establecimiento = Establecimiento(0)
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this@AnadirEstablecimientoActivity)
val usuarioID = sharedPref.getInt("actualUserID",-1)
establecimiento.usuarioID = usuarioID
}
when (item.itemId) {
R.id.itemSave -> {
establecimiento.nombre = NombreEstablecimientoTV.text.toString()
establecimiento.tipo = tipoEstablecimiento
establecimiento.direccion = DireccionEstablecimientoTV.text.toString()
establecimiento.telefono1 = Telefono1EstablecimientoTV.text.toString()
establecimiento.telefono2 = Telefono2EstablecimientoTV.text.toString()
establecimiento.email = EmailEstablecimientoTV.text.toString()
establecimiento.sitioWeb = SitioWebEstablecimeintoTV.text.toString()
establecimiento.latitud = latitud
establecimiento.longitud = longitud
if(establecimiento.usuarioID != -1){
saveEstablishmentToDB(establecimiento)
}
return true
}
android.R.id.home -> {
onBackPressed()
return true
}
}
return super.onOptionsItemSelected(item)
}