Двустороннее связывание данных из комнаты для редактирования текста и обратно - PullRequest
0 голосов
/ 06 февраля 2019

Вот что у меня есть:

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()
  }

Похоже, только если список измененданные обновляются, и наблюдатель вызвал.Если это объект внутри списка, ничего не происходит.

Что мне добавить, если я хочу, чтобы отредактированное значение сохранялось в модели?

...