【问题标题】:Update Query not updating entity values Room更新查询不更新实体值房间
【发布时间】:2019-09-06 07:03:12
【问题描述】:

Room , Mvvm Created , Kotlin - Add , Delete 正在工作 但是当我运行更新时没有任何变化

我已经调试了应用程序,dao,repo 和 viewModel 类正在显示更改,但没有任何更改反映在我的 recyclerView 上,或者当我销毁并再次打开我的应用程序时它没有更改

我的模型/实体类:

data class IceBreakerModel(val question:String,
                           val date:String,
                           val option1:String,
                           val option2:String,
                           val option3:String){
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0
}

道:-

interface IcebreakerDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertQuestion(question:IceBreakerModel)

    @Query("DELETE FROM ice_breaker_questions WHERE id=:ID")
    fun deleteQuestion(ID:Int)

    @Query("SELECT * FROM ice_breaker_questions")
    fun getAllIcebreakerQuestions():LiveData<List<IceBreakerModel>>

    @Update(onConflict = OnConflictStrategy.REPLACE)
    fun updateIcebreakerQuestion(question:IceBreakerModel)

//    @Query("UPDATE ice_breaker_questions SET  question =:newQuestion ,date=:newDate,option1=:newOption1,option2=:newOption2,option3=:newOption3 WHERE id=:ID")
//    fun updateQuestion(newQuestion:String,newDate:String,newOption1:String,newOption2:String,newOption3:String,ID:Int)
}

回购:-

    private class UpdateQuestion(dao:IcebreakerDao):AsyncTask<IceBreakerModel,Unit,Unit>(){
        val questionDao = dao
        override fun doInBackground(vararg params: IceBreakerModel?) {
            val model = params[0]!!
            questionDao.updateIcebreakerQuestion(model)
//            questionDao.updateQuestion(model.question,model.date,model.option1,model.option2,model.option3,model.id)
        }
    }

最后是我要更新的主要活动

iceBreakerViewModel.updateQuestion(IceBreakerModel(question,Date().toString(),option1,option2,option3))
                    adapter.notifyDataSetChanged()

【问题讨论】:

  • 您在 DAO 中使用 @Update 查询并从视图中调用 updateQuestion() 函数。请更正并重试。
  • @PRERNAGUPTA 请再次检查,我正在从我已经拥有的 viewModel 中调用 updateQuestion。有趣的 updateQuestion(question:IceBreakerModel){ repository.updateQuestion(question) }

标签: android kotlin mvvm android-room


【解决方案1】:

你评论的方法:

@Query("UPDATE ice_breaker_questions SET  question =:newQuestion ,date=:newDate,option1=:newOption1,option2=:newOption2,option3=:newOption3 WHERE id=:ID")
fun updateQuestion(newQuestion:String,newDate:String,newOption1:String,newOption2:String,newOption3:String,ID:Int)

是要走的路。至少我是这样更新我的专栏的。

另外,假设您使用 LiveData,我认为您需要在 Activity 和 ViewModel 中的 ViewModel 观察者内部adapter.notifyDataSetChanged()

如果您需要其他任何内容,请告诉我,因为我可能在某个地方错过了重点

【讨论】:

  • 是的,但是我不能使用 id cz 然后我需要通过检查我的实体类 id 不在公共构造函数中来从我的 mainActivity 发送 id!它是私人的
  • 我模拟了您的模型,您可以执行“model.id”来获取您的 ID。我刚试过。您是否通过执行“private var id: Int=0”更改了模型?
  • 这是我的模型/实体数据类 IceBreakerModel(val question:String, val date:String, val option1:String, val option2:String, val option3:String){ @PrimaryKey(autoGenerate = true ) 变量 id: Int = 0 }
  • 但是我现在改变了我的模型,并在公共构造函数中获取了 id,并且在添加时我正在为 id 添加 (0..100).random() ,它现在正在更新,但这是好方法吗?
  • 我不这么认为,因为随机生成的 ID 可能与您已有的 ID 相等,替换现有问题,这是我认为您不想要的。很奇怪,您无法访问 id。看这里prnt.sc/p2kjqf没有任何错误
猜你喜欢
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2014-06-17
  • 2014-08-13
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多