
在上一篇中,重点讲解了Jetpack里面的DataBinding组件。在本篇中,将会讲解Jetpack对应的Room组件。
1、Room介绍那么何为Room?
Android采用SQLLite作为数据库存储,开源社区常见的(ORMObject Relational Mapping)库有ORMLite、GreemDAO等。Room和其他库一样,也是在SQLLite上提供了一层封装。
Room重要概念
- Entity: 实体类,对应的数据库的一张表结构,使用注解@Enity标记
- Dao: 包含访问一系列访问数据库的方法,使用注解@Dao标记
- Database 数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点,使用注解@Database标记,另外需要满足以下条件:
- 定义的类必须是一个继承于RoomDatabase的抽象类
- 在注解中需要定义与数据库相关联的实体类列表,包含一个没有参数的抽象方法并且返回一个Dao对象
他们之间的关系如下图
概念说完了,现在开始实战部分!
@Entity(tableName = "student")
class Student {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id", typeAffinity = ColumnInfo.INTEGER)
var id = 0
@ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)
var name: String? = null
@ColumnInfo(name = "age", typeAffinity = ColumnInfo.INTEGER)
var age = 0
constructor(id: Int, name: String?, age: Int) {
this.id = id
this.name = name
this.age = age
}
@Ignore
constructor(name: String?, age: Int) {
this.name = name
this.age = age
}
@Ignore
constructor(id: Int) {
this.id = id
}
}
注解解析:
- @Entity(tableName = "student"),顾名思义,其意表明对应的表名为student
- @PrimaryKey(autoGenerate = true),表示修饰属性为对应表主键,autoGenerate为自动增长
- @ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT),表示为对应的列名,以及对应列名类型
- @Ignore,表示Room组件将忽略对应构造函数,对应修饰的构造函数只能给开发者用
- 未使用@Ignore修饰的的构造函数,将由Room组件调用(必须要留一个),当然开发者也可调用。
满足上面所说:1、继承于RoomDatabase的抽象类;2、返回对应的Dao
@Database(entities = [Student::class], version = 1, exportSchema = false)
abstract class MyDatabase : RoomDatabase() {
companion object{
private const val DATAbase_NAME = "my_db.db"
private var mInstance: MyDatabase? = null
@Synchronized
@JvmStatic
open fun getInstance(context: Context): MyDatabase? {
if (mInstance == null) {
mInstance = Room.databaseBuilder(
context.applicationContext,
MyDatabase::class.java,
DATAbase_NAME
) //.allowMainThreadQueries()
.build()
}
return mInstance
}
}
abstract fun getStudentDao(): StudentDao?
}
对应@Database(entities = [Student::class], version = 1, exportSchema = false)注解修饰的类,表示为对应的Database
里面内容分别表示为:对应的表名(可多个)、数据库版本、暂时先理解为数据库升级需要使用的标签(后面会详解)
2.3 接下来就是对应的Dao@Dao
interface StudentDao {
@Insert
fun insertStudent(vararg students: Student?)
@Delete
fun deleteStudent(vararg students: Student?)
@Update
fun updateStudent(vararg students: Student?)
@Query("SELECT * FROM student")
fun getAllStudent(): List?
@Query("SELECt * FROM student WHERe id = :id")
fun getStudentById(id: Int): List?
}
这里没啥可说的,看对应注解就能知道对应作用。
不过注意的是:这里的WHERe id = :id里面的:id需要和对应方法的形参一一对应。
现在三者都准备好了,来看看如何使用!
2.4 使用Roomclass MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
private var adapter: StudentRecyclerViewAdapter? = null
private var studentDao: StudentDao? = null
private var listStudent: ArrayList = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recycleView = findViewById(R.id.recycleView)
recycleView.layoutManager = LinearLayoutManager(this)
adapter = StudentRecyclerViewAdapter(listStudent)
recycleView.adapter = adapter
val database: MyDatabase? = MyDatabase.getInstance(this)
studentDao = database!!.getStudentDao()
}
fun mInsert(view: View?) {
launch(Dispatchers.Default) {
val s1 = Student("Jack", 22)
val s2 = Student("Rose", 18)
studentDao!!.insertStudent(s1, s2)
}
}
fun mQuery(view: View?) {
launch(Dispatchers.Default) {
val students: ArrayList = studentDao!!.getAllStudent() as ArrayList
withContext(Dispatchers.Main) {
adapter!!.students = students
adapter!!.notifyDataSetChanged()
}
}
}
fun mDelete(view: View?) {
launch(Dispatchers.Default) {
val s1 = Student(2)
studentDao!!.deleteStudent(s1)
}
}
fun mUpdate(view: View?) {
launch(Dispatchers.Default) {
val s1 = Student(3, "Jason", 21)
studentDao!!.updateStudent(s1)
}
}
}
这里为了直观体现Room的作用,暂时使用了比较原始的方式。这样能够快速掌握Room,当掌握Room后再来玩ViewModel+LiveData+DataBinding相关的。
来看看运行效果
很简单的,不过这里每 *** 作一次都需要额外去查询一次,相当的麻烦。不过在下一篇将会通过LiveData实现自动刷新数据。
Demo:点我下载
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)