Android jetpack room+ViewModel+liveData 数据自动更新
Posted 安果移不动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android jetpack room+ViewModel+liveData 数据自动更新相关的知识,希望对你有一定的参考价值。
Android jetpack room的使用_安果移不动的博客-CSDN博客
接上篇博客
我们用google推荐的这种方式
修改:
StudentDao
package com.anguomob.jecpack.dao
import androidx.lifecycle.LiveData
import androidx.room.*
import com.anguomob.jecpack.bean.Student
@Dao
interface StudentDao
@Insert
fun insertStudent(vararg student: Student)
@Delete
fun deleteStudent(vararg student: Student)
@Query("DELETE FROM student")
fun deleteAllStudent()
@Update
fun updateStudent(vararg student: Student)
@Query("SELECT * FROM student")
fun queryAllStudent(): LiveData<List<Student>>
@Query("SELECT * FROM student where id = :id")
fun getStudentById(id: Int): List<Student>
新增
StudentRepository类
package com.anguomob.jecpack.repository
import android.content.Context
import android.os.AsyncTask
import androidx.lifecycle.LiveData
import com.anguomob.jecpack.bean.Student
import com.anguomob.jecpack.dao.StudentDao
import com.anguomob.jecpack.database.MyDataBase
class StudentRepository(var context: Context)
private lateinit var studentDao: StudentDao
init
val dataBase = MyDataBase.getSingle(context)
this.studentDao = dataBase.getStudentDao();
fun insertStudent(vararg student: Student)
InsertStudentTask(studentDao).execute(*student)
fun deleteStudent(vararg student: Student)
DeleteStudentTask(studentDao).execute(*student)
fun updateStudent(vararg student: Student)
UpdateStudentTask(studentDao).execute(*student)
fun queryAllStudent():LiveData<List<Student>>
return studentDao.queryAllStudent()
fun deleteAllStudent()
DeleteAllStudentTask().execute()
inner class InsertStudentTask(var studentDao: StudentDao) : AsyncTask<Student, Any, Any>()
override fun doInBackground(vararg p0: Student)
studentDao.insertStudent(*p0)
inner class UpdateStudentTask(var studentDao: StudentDao) : AsyncTask<Student, Any, Any>()
override fun doInBackground(vararg p0: Student)
studentDao.updateStudent(*p0)
inner class DeleteStudentTask(var studentDao: StudentDao) : AsyncTask<Student, Any, Any>()
override fun doInBackground(vararg p0: Student)
studentDao.deleteStudent(*p0)
inner class DeleteAllStudentTask() : AsyncTask<Any, Any, Any>()
override fun doInBackground(vararg p0: Any)
studentDao.deleteAllStudent()
新增
StudentViewModel
package com.anguomob.jecpack.viewmodel
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import com.anguomob.jecpack.bean.Student
import com.anguomob.jecpack.repository.StudentRepository
class StudentViewModel(application: Application) : AndroidViewModel(application)
private lateinit var repository: StudentRepository
init
repository = StudentRepository(application)
fun insertStudent(vararg student: Student)
repository.insertStudent(*student)
fun deleteStudent(vararg student: Student)
repository.deleteStudent(*student)
fun updateStudent(vararg student: Student)
repository.updateStudent(*student)
fun queryAllStudent(): LiveData<List<Student>>
return repository.queryAllStudent()
fun deleteAllStudent()
repository.deleteAllStudent()
修改页面代码
package com.anguomob.jecpack.activity
import android.annotation.SuppressLint
import android.os.AsyncTask
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.anguomob.jecpack.R
import com.anguomob.jecpack.adapter.RoomAdapter
import com.anguomob.jecpack.bean.Student
import com.anguomob.jecpack.dao.StudentDao
import com.anguomob.jecpack.database.MyDataBase
import com.anguomob.jecpack.databinding.ActivityRoomBinding
import com.anguomob.jecpack.repository.StudentRepository
import com.anguomob.jecpack.viewmodel.StudentViewModel
class RoomActivity : AppCompatActivity()
private lateinit var binding: ActivityRoomBinding
private lateinit var adapter: RoomAdapter
private lateinit var viewModel: StudentViewModel
@SuppressLint("NotifyDataSetChanged")
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
binding = ActivityRoomBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.rv.layoutManager = LinearLayoutManager(this)
adapter = RoomAdapter()
binding.rv.adapter = adapter;
viewModel =
ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)).get(
StudentViewModel::class.java
);
viewModel.queryAllStudent().observe(this) data ->
adapter.setData(data)
adapter.notifyDataSetChanged();
fun insert(view: View)
val s1 = Student("Jack", 20)
val s2 = Student("Jack2", 21)
viewModel.insertStudent(s1, s2)
fun change(view: View)
val s1 = Student(15, "LiuAn", 27)
val s2 = Student(16, "LiuAN2", 18)
viewModel.updateStudent(s1, s2)
fun delete(view: View)
val s1 = Student(20)
viewModel.deleteStudent(s1)
fun clear(view: View)
viewModel.deleteAllStudent()
布局文件把查询替换为了清空
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.RoomActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.09165527" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.19015048" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="insert"
android:text="增加"
app:layout_constraintBottom_toTopOf="@+id/guideline5"
app:layout_constraintEnd_toStartOf="@+id/guideline8"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="change"
android:text="修改"
app:layout_constraintBottom_toTopOf="@+id/guideline5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline8"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="delete"
android:text="删除"
app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintEnd_toStartOf="@+id/guideline8"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline5" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="clear"
android:text="清空"
app:layout_constraintBottom_toTopOf="@+id/guideline7"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline8"
app:layout_constraintTop_toTopOf="@+id/guideline5" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline7" />
</androidx.constraintlayout.widget.ConstraintLayout>
这种做法可以让数据自己展示出来。从而达到更加方便不用每次操作后手动去查询
非常的时尚
以上是关于Android jetpack room+ViewModel+liveData 数据自动更新的主要内容,如果未能解决你的问题,请参考以下文章
Android Jetpack: Room | 中文教学视频
Android Jetpack Paging 3:带 Room 的 PagingSource
Android jetpack room 记录数据库升级日志
Android jetpack room+ViewModel+liveData 数据自动更新