一、Room简介
Room是Jetpack库中的一部分,它是官方为了开发者更好的使用android数据库功能而推出的ORM框架。
什么是ORM?
ORM(Object Relational Mapping) 对象关系映射
由于我们使用的编程语音是面向对象语言,而使用的数据库是关系型数据库,所以需要在面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是ORM。
使用ORM框架的好处在于我们可以用面向对象的思维来和数据库进行交互。
Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。
二、使用
Room的整体结构由3个部分组成:Entity、Dao、Database
Entity就是数据的实体类,每个实体类对应数据库中的一张表,表中的列根据实体类中字段自动生成;
Dao数据库访问接口,在这里封装对数据库的各种操作;
Database用于定义数据库中的关键信息,提供Dao层的访问实例。
下面就开始使用room写一个增删改查的小案例:
1、添加依赖
使用Room需要我们加入一个插件以及两个依赖库
添加kotlin-kapt插件:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
id 'kotlin-kapt'
}
添加依赖
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
2、创建数据实体类
package com.example.roomdemo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
data class Book(var name:String,var author:String,var pages:Int,var prise:Float) {
@PrimaryKey(autoGenerate = true)
var id:Long = 0
}
使用注解@Entity来标明这是一个实体类,在类中添加一个id字段,使用@PrimaryKey(autoGenerate = true)注解来声明这是主键而且它的值是自动生成的。
3、创建Dao接口层
Dao层的作用就是封装对数据库的各种操作,覆盖所有的业务需求。
Room提供了@Insert、@Delete、@Update、@Query来进行增删改查的操作。
在接口上面使用@Dao注解让Room知道这是一个Dao类
package com.example.roomdemo
import androidx.room.*
@Dao
interface BookDao {
//增加
@Insert
fun insertBook(book:Book):Long
//删除
@Delete
fun deleteBook(book: Book)
//更新
@Update
fun updateBook(newBook: Book)
//查询
@Query("select * from Book")
fun queryAllBooks():List<Book>
//按条件查询
@Query("select * from Book where pages > :page")
fun getBookByPage(page:Int):List<Book>
//按条件删除
@Query("delete from Book where pages > :page")
fun deleteBookByPage(page: Int):Int
}
注意,在使用非实体类参数增 删 改时,使用的是@Query注解
例如:
//按条件删除
@Query("delete from Book where pages > :page")
fun deleteBookByPage(page: Int):Int
4、创建RoomDatabase扩展类
我们需要自定义一个抽象类来继承RoomDatabase类,必须是抽象类。
package com.example.roomdemo
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database(version = 1, entities = [Book::class])
abstract class AppDatabase: RoomDatabase() {
abstract fun bookDao(): BookDao
companion object{
private var instance:AppDatabase? = null
@Synchronized
fun getDatabase(context:Context):AppDatabase{
instance?.let {
return it
}
return Room.databaseBuilder(context.applicationContext,
AppDatabase::class.java,
"BookStore.db")
.build().apply {
instance = this
}
}
}
}
使用@Database(version = 1, entities = [Book::class])注解来定义数据库的版本,以及表对应的实体类,多个实体类用逗号分隔。
在该类中,用单例模式来保证全局只有一个AppDatabase实例。然后提供一个抽象方法用于获取Dao类实例,我们不需要这里创建Dao类实例,只需声明方法,因为room底层会帮我们完成创建。
5、执行增删改查
在布局中放几个按钮,在按钮的点击事件中执行增删改查的操作
package com.example.roomdemo
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import kotlin.concurrent.thread
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bookDao = AppDatabase.getDatabase(this).bookDao()
val book1 = Book("Android开发艺术探索","任玉刚",467,56.00f)
val book2 = Book("第一行代码","郭霖",672,80.00f)
//增加两条数据
addData.setOnClickListener {
thread {
book1.id = bookDao.insertBook(book1)
book2.id = bookDao.insertBook(book2)
}
}
//删除两条数据
deleteData.setOnClickListener {
thread {
bookDao.deleteBook(book1)
bookDao.deleteBook(book2)
}
}
//将book1的价格更新为52.00
updateData.setOnClickListener {
thread {
book1.prise = 52.00f
bookDao.updateBook(book1)
}
}
//查询所有数据
selectData.setOnClickListener {
thread {
for (book in bookDao.queryAllBooks()) {
println(book.toString())
}
}
}
//查询页数大于500的书籍
selectByPage.setOnClickListener {
thread {
for (book in bookDao.getBookByPage(500)) {
println("页数大于500的书籍:$book")
}
}
}
//删除页数大于500的书籍
deleteByPage.setOnClickListener {
thread {
val num = bookDao.deleteBookByPage(500)
println("删除页数大于500的书籍:$num")
}
}
}
}