这是我所拥有的:
1)实体BatimentModel,其中包含一些字符串
@Entity(tableName = "batiments")
class BatimentModel : Serializable {
@PrimaryKey
lateinit var uuid: String
var mNomBatiment = ""
var mNomProprietaire = ""
}
2)此实体的DAO,具有基本方法(我删除了“删除”方法)
@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会自动填充数据库中的列表。如果我使用fab添加“ Batiment”,则可以正确插入该视图并正确刷新视图。
当我选择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()
}
看起来只有在修改列表后,数据才会被更新并调用观察者。如果它是列表中的对象,则什么都不会发生。
如果我希望将编辑后的值保存在模型中,应该添加什么?