引言

  • 本文章旨在记录学习Android JetPack库下的Room数据库的使用,不作过于深入原理的讲解,如有问题和建议请留言讨论。

1、Room 库概念及架构示意图

概念

Google的介绍:
  处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的使用场景是缓存相关的数据,这样一来,当设备无法访问网络时,用户仍然可以在离线状态下浏览该内容,
  Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库

  Room 库具有一下优势:

  • 针对 SQL 查询的编译时验证
  • 可最大限度减少重复和容易出错的样板代码的方便注解
  • 简化了数据库迁移路径

架构示意图

主要组件

Room 包含三个主要组件

  • 数据库类(Room Database),用于保存数据库并作为应用持久性数据底层连接的主要访问点
  • 数据实体(Entities),用于表示应用的数据库中的表
  • 数据访问对象 (Data Access Objects【Dao】),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法

2、使用(Kotlin版【带注释】)

效果图展示

Android Room数据库操作

附上代码库地址:https://github.com/zqf-dev/ZRoomCode

依赖项添加

  • 在build.gradle(Project)文件下添加版本
ext {roomVersion = '2.4.2'
}
  • 在build.gradle(app)文件下添加
plugins {id 'com.android.application'id 'kotlin-android'// 添加kapt注解处理器id 'kotlin-kapt'
}android {//排除原子函数模块并防止出现警告packagingOptions {exclude 'META-INF/atomicfu.kotlin_module'}kotlinOptions {jvmTarget = "1.8"}
}dependencies{//ktximplementation 'androidx.core:core-ktx:1.7.0'// roomimplementation "androidx.room:room-ktx:$rootProject.roomVersion"kapt "androidx.room:room-compiler:$rootProject.roomVersion"// 展示数据 adapterimplementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7'
}

实体类(Entities)创建

数据库(Database)创建

*注:exportSchema:是否允许数据库架构将导出到给定的文件夹中【 默认true 】

/*** Author: zqf* Date: 2022/05/11* 数据库创建* entities: 实体类* version: 数据库初始版本号* exportSchema: 是否允许数据库架构将导出到给定的文件夹中【 默认true 】**/
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class ZRoomDB : RoomDatabase() {//创建userDaoabstract fun userDao(): UserDao
}

数据访问对象 (DAO)创建

/*** Author: zqf* Date: 2022/05/11* 数据访问对象*/
@Dao
interface UserDao {// 查询@Query("SELECT * FROM loginUser")fun queryAllUser(): MutableList<User>//根据姓名参数查询@Query("SELECT * FROM loginUser WHERE name = :name")fun queryFindUser(name: String): User?// 添加单条数据@Insertfun addUser(vararg user: User)// 添加批量数据@Insert(onConflict = OnConflictStrategy.REPLACE)fun addBatchUser(list: MutableList<User>)// 更新某一个数据@Updatefun updateUser(vararg user: User)//更新所有数据@Query("UPDATE loginUser set age='50'")fun updateAll()//删除某一个数据@Deletefun deleteSingle(vararg user: User)//删除表里所有数据@Query("DELETE FROM loginUser")fun deleteAllUser()
}

数据管理类封装

/*** Author: zqf* Date: 2022/05/11* 数据库管理工具*/
object DbManager {//数据库名private const val dbName: String = "zroom"//懒加载创建数据库val db: ZRoomDB by lazy {Room.databaseBuilder(App.app.applicationContext, ZRoomDB::class.java, dbName).allowMainThreadQueries()//允许在主线程操作.addCallback(DbCreateCallBack)//增加回调监听.addMigrations()//增加数据库迁移.build()}private object DbCreateCallBack : RoomDatabase.Callback() {//第一次创建数据库时调用override fun onCreate(db: SupportSQLiteDatabase) {super.onCreate(db)Log.e("TAG", "first onCreate db version: " + db.version)}}
}

使用方法

class MainActivity : AppCompatActivity() {private val TagL = MainActivity::class.java.simpleNameprivate lateinit var queryBtn: Buttonprivate lateinit var insertBtn: Buttonprivate lateinit var updateBtn: Buttonprivate lateinit var deleteBtn: Buttonprivate lateinit var resultRecycle: RecyclerViewprivate var list = mutableListOf<User>()var userDao: UserDao = DbManager.db.userDao()private val userAdapter by lazy {UserAdapter(R.layout.user_item_layout)}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findVbId()}private fun findVbId() {queryBtn = findViewById(R.id.query)insertBtn = findViewById(R.id.insert)updateBtn = findViewById(R.id.update)deleteBtn = findViewById(R.id.delete)resultRecycle = findViewById(R.id.result_recycle)resultRecycle.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)resultRecycle.adapter = userAdapteruserAdapter.addChildClickViewIds(R.id.item_delete, R.id.item_modify)queryBtn.setOnClickListener { query() }insertBtn.setOnClickListener { insertSingle() }deleteBtn.setOnClickListener { delete() }updateBtn.setOnClickListener { update() }userAdapter.setOnItemChildClickListener { _, view, position ->when (view.id) {R.id.item_delete -> singleDel(list[position])R.id.item_modify -> singleModify(list[position])}}insertAll()}/*** 查询*/private fun query() {list = userDao.queryAllUser()Log.e(TagL, list.toString())userAdapter.setList(list)}/*** 默认插入批量数据*/private fun insertAll() {runBlocking {if (userDao.queryAllUser().size == 0) {val mutableList: MutableList<User> = mutableListOf()for (a in 1..3) {val user = User("张三$a", 20 + a, "贵阳市观山湖区$a", "")mutableList.add(user)}userDao.addBatchUser(mutableList)ToastUtil.show("批量新增数据成功")}query()}}/*** 插入单条数据*/private fun insertSingle() {val age = Random.nextInt(20, 40)val user = User("小二", age, "贵阳市观山湖区", "")userDao.addUser(user)ToastUtil.show("新增一条数据成功")query()}/*** 删除表里的所有数据*/private fun delete() {userDao.deleteAllUser()ToastUtil.show("删除所有数据成功")query()}/*** 更新所有数据*/private fun update() {userDao.updateAll()ToastUtil.show("更新表里所有年龄数据成功")query()}/*** 删除loginUser表里的指定删除某一个*/private fun singleDel(singleUser: User) {userDao.deleteSingle(singleUser)ToastUtil.show("删除单条数据成功")query()}/*** 修改数据表里某一个对象的字段值*/private fun singleModify(user: User) {user.aliasName = "修改的" + user.aliasNameuser.age = 100user.ads = "修改的地址白云区"userDao.updateUser(user)ToastUtil.show("更新单条数据成功")list.clear()query()}
}

数据库升级

  • Room 同时支持自动和手动方式进行增量迁移
  • *注:Room 在 2.4.0-alpha01 及更高版本中支持自动迁移。如果您的应用使用的是较低版本的 Room,则必须手动定义迁移。

1、手动迁移

  • 在实体类User里新增 字段gender
/*** Author: zqf* Date: 2022/05/11* 数据实体* TODO*  1、@Entity:Room实体类注解 ---> 默认情况下,Room 将【类名称】用作数据库【表名称】*      注:如果您希望【数据库表】具有不同的名称,请设置 @Entity 注解的 tableName 属性*  2、PrimaryKey: 主键( autoGenerate = true 主键自增 ),作用:唯一标识相应数据库表中的每一行*  3、@ColumnInfo:数据库表字段---> 默认情况下,使用【字段名称】作为数据库中的【列名称】*      注:如果您希望【数据表里的列】具有不同的名称,请将 @ColumnInfo 注解添加到该字段并设置 name 属性*  4、Ignore: 默认情况下,Room 会为实体中定义的每个字段创建一个列。 如果您不想保留该字段,则可以使用 @Ignore 为字段添加注解*/
@Entity(tableName = "loginUser")
data class User(@PrimaryKey(autoGenerate = true)var id: Int = 0,@ColumnInfo(name = "name")var aliasName: String = "",var age: Int = 0,var ads: String = "",@Ignorevar avatar: String = "",//数据库升级时测试的 新增字段var gender: Int = 0
) {constructor(aliasName: String, age: Int, ads: String, avatar: String) : this() {this.aliasName = aliasNamethis.age = agethis.ads = adsthis.avatar = avatar}
}
  • 1)创建 Migration 类,版本从v1—>v2,添加了‘gender’字段 默认值为1
  • 2)SQL语句:
      2.1)数据库表里增加字段
       ALTER TABLE loginUser ADD gender INTEGER Default 1 not null
      2.2)数据库新增表
       CREATE TABLE Car (id INTEGER, name TEXT, PRIMARY KEY(id))
/*** 数据库升级*/private object ZMigration : Migration(1, 2) {override fun migrate(database: SupportSQLiteDatabase) {Log.e(TagL, "执行数据库升级: ")//loginUser表中增加字段genderdatabase.execSQL("ALTER TABLE loginUser ADD gender INTEGER Default 1 not null")//新建汽车数据表//database.exceSQL("CREATE TABLE Car (id INTEGER, name TEXT, PRIMARY KEY(id))")}}
//懒加载创建数据库
//懒加载创建数据库val db: ZRoomDB by lazy {Room.databaseBuilder(App.app.applicationContext, ZRoomDB::class.java, dbName).allowMainThreadQueries()//允许在主线程操作.addCallback(DbCreateCallBack)//增加回调监听.addMigrations(ZMigration)//增加数据库迁移.build()}
  • 修改Database version版本为 2,依次调整
@Database(entities = [User::class], version = 2, exportSchema = false)
abstract class ZRoomDB : RoomDatabase() {//创建userDaoabstract fun userDao(): UserDao
}

执行结果:

Android Room 数据库最佳入门教程相关推荐

  1. flex+android+教程,android开发flex4.5入门教程.pdf

    android开发flex4.5入门教程 中国矿业大学教务部 教务通知(2013 )第33 号 关于做好各级"大学生创新训练计划" 项目中期检查和结题验收的通知 各学院: 为加强我 ...

  2. 8步教你打开Android之门 NDK入门教程

    这是一篇Android NDK开发的入门教程,在这一教程结束后,你将创建你自己的项目,从Java代码简单地调用原生C语言代码. 本文为一篇外文翻译,我们将介绍如何学习安装 Android NDK 并开 ...

  3. Android百度地图开发入门教程

    Android百度地图开发入门教程 1.平台注册登录 2.创建应用 3.Android studio配置 4.代码编写 5.最终效果(建议真机) 1.平台注册登录 登录百度地图开放平台网站注册并登录 ...

  4. 数据库快速入门教程--视频

    数据库快速入门教程--视频 下载地址:http://v.51work6.com/courseInfoRedirect.do?action=courseInfo&courseId=240579 ...

  5. Mysql数据库基础入门教程

    Mysql数据库基础入门教程 课程链接:https://www.bilibili.com/video/BV1Qb411x7Yc?p=1 2022/1/22start 一.数据库简介 1.什么是数据库? ...

  6. 《数学之美》——机器学习最佳入门教程

    本文转载至:http://www.cricode.com/3095.html 数学之美系列 目录 作者:吴军, Google研究员:   来源:Google黑板报   快课网整理 数学之美 一 统计语 ...

  7. MySQL数据库新手入门教程

    相信很多做数据分析的朋友都发现,在平时做业务分析中,Excel表格是我们使用最频繁的工具.我们还发现,Excel虽然好用,但一旦数据量大了起来,比如处理二三十万条或以上数据量的时候,就会出现卡顿,甚至 ...

  8. XML 新手最佳入门教程

    XML.XHTML.XPath.SAX.DOM-- 面对众多的 XML 术语,作为新手您是否觉得有点目不暇接?学习 XML 从哪里入手最好?不用犹豫和彷徨了,赶快上 developerWorks!我们 ...

  9. python十大操作方法_python最佳入门教程(19): 列表操作方法

    1 教程引言 本教程基于python3.x, 是针对初学者的一系列python入门教程,在知乎上常有人问我计算机该怎么学,如何自学编程,笔者也是通过自学编程而进入IT这一行业的,回顾入行的这几年,从音 ...

最新文章

  1. 提高PHP编码的一些技巧
  2. PV操作——生产者和消费者
  3. Xilinx ISE 开发过程中生成的各种文件(一)
  4. Jenkins + Git + Maven + tomcat集成环境搭建
  5. 用SparseArray代替HashMap
  6. 快速了解一门技术的基本步骤
  7. python交互模式切换_Python 交互式窗口 (REPL) - Visual Studio | Microsoft Docs
  8. mysql重做日志与binlog日志区别_MySQL日志之binlog、redo log、undo log
  9. shiro框架的学习
  10. 数据解读京东上最受欢迎的面包
  11. PHP笔记-Smarty模板引擎的使用
  12. Unity -- .NET下的原生Ioc框架
  13. Spark1.5.1学习笔记汇总
  14. Openstack之路(四)计算服务Nova
  15. C语言题目——三子棋游戏
  16. 计算机常用英语术语词汇表
  17. C++学习(一八一)android的NDK、SDK版本的对应关系
  18. ROS pgm转jpg
  19. filp 同步复位 异步复位
  20. 基于QlExpress实现薪资计算

热门文章

  1. 显卡上DirectX 9.0 是什么意思
  2. pytorch Cosine Annealing LR
  3. 常用中文字体的英文名称
  4. remove debug symbols to a seperate file
  5. 1124 Raffle for Weibo Followers(map)
  6. 你和你的女神之间,差了一个OpenCV口红色号识别器,android开发环境的搭建步骤
  7. TapTap 发布开发者服务:降低开发者研运成本 聚焦创作优质内容
  8. IC - 什么是数字IC设计?
  9. 适合中学生看的英文电影
  10. hellow windows