Вот что у меня есть:
1) Модель Batiment Entity с некоторой строкой
@Entity(tableName = "batiments")
class BatimentModel : Serializable {
@PrimaryKey
lateinit var uuid: String
var mNomBatiment = ""
var mNomProprietaire = ""
}
2) DAO для этого объекта с основными методами (я удалилметоды "delete")
@Dao
interface BatimentDao {
@Query("SELECT * FROM batiments")
fun getAllBatiment() : LiveData <List<BatimentModel>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertBatiment(vararg batiment: BatimentModel)
@Query("SELECT * FROM batiments WHERE uuid = :uuid")
fun getBatimentWithUuid(uuid: String): LiveData <BatimentModel>
@Update
fun updateBatiment(vararg batiment: BatimentModel)
}
3) Затем у меня есть репозиторий.Он вызывает функцию из DAO и является абстракцией между DAO и ViewModel
4) Затем у меня есть моя ViewModel.Я храню список всех BatimentModel в виде LiveData>
class BatimentViewModel(application: Application): AndroidViewModel(application){
private val batimentRepository: BatimentRepository
val allBatiment: LiveData <List<BatimentModel>>
init {
batimentRepository = BatimentRepository(application)
allBatiment = batimentRepository.getAllBatiment()
}
fun insert(batiment: BatimentModel){
batimentRepository.insert(batiment)
}
fun updateBatiment(batiment: BatimentModel) {
batimentRepository.updateBatiment(batiment)
}
fun getBatimentWithUUID(uuid: String): LiveData <BatimentModel> {
return batimentRepository.getBatimentWithUUID(uuid)
}
}
5) У меня есть фрагмент с макетом, с RecyclerView слева и некоторым EditText справа.
Пример EditText:
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/propriete_batiment_nom_batiment"
android:text="@={batimentPropriete.MNomBatiment}"
android:hint="Nom du batiment"/>
RecyclerView автоматически заполняется списком из базы данных.Если я добавляю «Batiment», используя fab, он правильно вставляется, и представление обновляется правильно.
Когда я нажимаю на элемент в RecyclerView, значение этого элемента отображается в тексте редактированиясправа.Если я редактирую одно из значений, щелкаю по другому элементу (чтобы текст редактирования заполнялся новыми данными), а затем возвращаюсь к первому элементу, измененное значение по-прежнему изменяется!Но он не сохраняется в базе данных, и если я закрою приложение, его там больше не будет
Фрагмент "OnCreateView"
//Bind and get view
val binding =
DataBindingUtil.inflate<FragmentBatimentBinding>(inflater, R.layout.fragment_batiment, container, false)
val v = binding.root
//Creating RV and Adapter
val recyclerView = v.rv_batiment
val adapter = BatimentListAdapter(context!!)
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = adapter
//Setting obersvable
activity?.let {
mBatimentViewModel = ViewModelProviders.of(it).get(BatimentViewModel::class.java)
}
//Link it with adapter
mBatimentViewModel!!.allBatiment.observe(
this,
Observer<List<BatimentModel>> { t: List<BatimentModel> ->
adapter.setBatiments(t)
})
//Post on clic
adapter.onItemClick = { batimentModel ->
binding.batimentPropriete = batimentModel
}
//Adding FAB action
v.fab_add_batiment.setOnClickListener {
addBatimentDialog()
}
Похоже, только если список измененданные обновляются, и наблюдатель вызвал.Если это объект внутри списка, ничего не происходит.
Что мне добавить, если я хочу, чтобы отредактированное значение сохранялось в модели?