【Android Room 库基础入门】

news2024/11/20 6:29:43

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、前言
  • 二、Room 主要组件
  • 三、Room 基础入门
    • 3.1 引入 Room 库到项目
    • 3.2 Room 使用示例
      • 3.2.1 定义数据实体类
      • 3.3.2 定义数据访问对象(DAO)
      • 3.3.3 定义数据库类
      • 3.3.4 创建数据库实例
      • 3.3.5 从数据库实例中获取数据访问对象(DAO)实例
      • 3.3.6 通过数据访问对象(DAO)实例操作数据库
  • 总结
        • 郭海城
        • https://blog.csdn.net/weixin_53644402/article/details/128195736


一、前言

Room 是 Android Jetpack 的一部分。在 Android 中数据库是SQLite数据库,Room 就是在SQLite上面提供了一个抽象层,通过 Room 既能流畅地访问数据库,又能充分展示 SQLite 数据库的强大功能。Room 主要有以下几大优点:
1.在编译时校验 SQL 语句;
2.易用的注解减少重复和易错的模板代码;
3.简化的数据库迁移路径。
正是 Room 有以上的优点,所以建议使用 Room 访问数据库。


提示:以下是本篇文章正文内容,下面案例可供参考

二、Room 主要组件

Room 主要组件有三个:
1.数据库类(RoomDatabase):拥有数据库,并作为应用底层持久性数据的主要访问接入点。
2.数据实体类(Entity):表示应用数据库中的表。
3.数据访问对象(DAO):提供方法使得应用能够在数据库中查询、更新、插入以及删除数据。
应用从数据库类获取一个与之相关联的数据访问对象(DAO)。应用可以通过这个数据访问对象(DAO)在数据库中检索数据,并以相关联的数据实体对象呈现结果;应用也可以使用对的数据实体类对象,更新数据库对应表中的行(或者插入新行)。应用对数据库的操作完全通过 Room 这个抽象层实现,无需直接操作 SQLite数据库。下图就是 Room 各个组件之间的关系图:
在这里插入图片描述

三、Room 基础入门

大致了解了 Room 的工作原理之后,下面我们就来介绍一下 Room 的使用入门。

3.1 引入 Room 库到项目

引入 Room 库到项目,在项目程序模块下的 build.gradle 文件的dependencies

// Kotlin 开发环境,需要引入 kotlin-kapt 插件
apply plugin: 'kotlin-kapt'

// .........

dependencies {
    // other dependecies 

    def room_version = "2.3.0"
    implementation("androidx.room:room-runtime:$room_version")
    // 使用 Kotlin 注解处理工具(kapt,如果项目使用Kotlin语言开发,这个必须引入,并且需要引入 kotlin-kapt 插件
    kapt("androidx.room:room-compiler:$room_version")
    // To use Kotlin Symbolic Processing (KSP)
    // ksp("androidx.room:room-compiler:$room_version")

    // 可选 - 为 Room 添加 Kotlin 扩展和协程支持
    implementation("androidx.room:room-ktx:$room_version")

    // 可选 - 为 Room 添加 RxJava2 支持
    implementation "androidx.room:room-rxjava2:$room_version"

    // 可选 - 为 Room 添加 RxJava3 支持
    implementation "androidx.room:room-rxjava3:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"

    // optional - Test helpers
    testImplementation("androidx.room:room-testing:$room_version")
}

3.2 Room 使用示例

使用 Room 访问数据库,需要首先定义 Room 的三个组件,然后通过数据访问对象实例访问数据。

3.2.1 定义数据实体类

数据实体类对应数据库中的表,实体类的字段对应表中的列。定义 Room 数据实体类,使用 data class 关键字,并使用 @Entity 注解标注。

@Entity
class User(@PrimaryKey val uid: Int, @ColumnInfo() val name: String, @ColumnInfo val age: Int)

3.3.2 定义数据访问对象(DAO)

数据访问对象是访问数据库的桥梁,通过 DAO 访问数据,查询或者更新数据库中的数据(数据实体类是媒介)。数据访问对象(DAO)是一个接口,定义时添加 @Dao 注解标注,接口中的每一个成员方法表示一个操作,成员方法使用注解标示操作类型。更多关于数据访问对象(DAO)和数据操作类型注解。以下是简单的 DAO 示例代码:

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE name LIKE :name")
    fun findByName(name: String): List<User>

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}

3.3.3 定义数据库类

数据库是存储数据的地方,使用 Room 定义数据库时,声明一个抽象类(abstract class),并用 @Database 注解标示,在 @Database 注解中使用 entities 参数指定数据库关联的数据实体类列表,使用 version 参数指定数据的版本。数据库类中包含获取数据访问实体类对象的抽象方法。

3.3.4 创建数据库实例

定义好数据实体类、数据访问对象(DAO)和数据类之后,便可以创建数据库实例。使用 Room.databaseBuilder().build() 创建一个数据库实体类,Room 会根据定义的数据实体类、数据库访问对象和数据库类,以及他们定义时指定的对应关系,自动创建数据库和对应的表关系。如以下示例代码所示:

val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "app_db").build()

3.3.5 从数据库实例中获取数据访问对象(DAO)实例

在定义数据库类时,将数据访问对象(DAO)类与之相关联,定义抽象方法返回对应的数据库访问对象(DAO)实例。在数据库实例化过程中,Room 会自动生成对应的数据访问对象(DAO),只需要调用定义数据库类时定义的抽象方法,即可获取对应的数据访问对象(DAO)实例。如下示例所示:

val userDao = db.userDao();

3.3.6 通过数据访问对象(DAO)实例操作数据库

获取到数据访问对象(DAO)实例,就可以调用数据库访问对象(DAO)类中定义的方法操作数据库了。如下示例所示:

Thread {
    // 插入数据
    userDao.insertAll(
        User(1, "Student1", 18), 
        User(2, "Student2", 18),
        User(3, "Student3", 17), 
        User(4, "Student4", 19)
    )

    // 查询数据
    val result = userDao.getAll()

    result.forEach {
        println("Student: id = ${it.uid}, name = ${it.name}, age = ${it.age}")
    }
}.start()

总结

Room 是非常强大易用的,可以减少数据库操作过程中的出错,因为所有的 SQL 语句都在编译是进行检查,如果存在错误,将会在编译时就显示错误信息。不仅如此,Room 还非常优秀地处理了多进程很多线程访问数据库的问题。下面是关于 Room 使用的进阶博文:

Android Room 数据实体类详解
Android Room 数据访问对象(DAO)详解
Android Room 数据库详解
在 Room 数据库中创建视图
使用单元测试测试您的 Room 数据库

郭海城

https://blog.csdn.net/weixin_53644402/article/details/128195736

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何成为一名IT咨询顾问?

咨询顾问这个工作&#xff0c;很多人都很羡慕&#xff0c;在别人看来咨询顾问的工作时间自由&#xff0c;可以到处出差和旅游&#xff0c;能够认识企业各种层面的人&#xff0c;见多识广。实际情况真的这么轻松吗&#xff1f;什么样的人适合做咨询顾问&#xff1f;做咨询顾问需…

《计算机网络》2022年期末试卷

《计算机网络》期末试卷2022年A卷

synchronized 关键字

文章目录一、synchronized 的特性互斥可重入二、 synchronized 使用示例三、 java标准库的线程安全类四、 死锁可重入死锁相互争夺锁哲学家就餐问题死锁的四个必要条件一、synchronized 的特性 互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时…

亚马逊、ebay测评自养号新手应该要怎么做?

如今很多的跨境卖家开始在深入了解测评自养号这块&#xff0c;都想在运营上减低一些成本&#xff0c;多增加一些利润。对于整个测评工作来说&#xff0c;测评技术可谓是非常核心的一个环节&#xff0c;多学习&#xff0c;不要浮躁&#xff0c;这样才能让我们不断提高自己的测评…

Android 3D 魔方游戏的设计与开发

Android 3D 魔方游戏的设计与开发 5.1 Feature 定义 魔方是一个有趣的益智游戏&#xff0c;相信很多人都玩过。本次毕业设计&#xff0c;欲完成的主要的功能如下&#xff1a; &#xff08;1&#xff09; 开始游戏&#xff1a;开始一个新的游戏 &#xff08;2&#xff09; 返…

Java项目:食品检测管理系统(java+SSM+JavaScript+layui+Mysql)

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 本项目后台食品检测管理系统&#xff1b; &#xff08;1&#xff09;用户管理&#xff1a;用户登录、验证。 &#xff08;2&#xff09;任务管理&#xff1a;添加任务、检品受理。 &#xff0…

数学基础从高一开始4、集合的基本运算2

数学基础从高一开始3、集合的基本运算2 目录 数学基础从高一开始3、集合的基本运算2 补集 例2&#xff1a; 总结&#xff1a; 补集 这里补集的符号我打不出来&#xff0c;这里就截图给大家看了啊。 下图是补集的语言表达&#xff0c;图形表达以及符号表达方式&#xff1a…

在无需分叉的情况下模拟任何 SIGHASH 标志

我们开发了一种新颖的方法来模拟任何 SIGHASH 标志&#xff0c;只需在智能合约中编写逻辑即可。它不需要更改协议&#xff0c;因此比每次构思新用例时通过分叉添加硬编码标志更实用和灵活。 SIGHASH 标志 SIGHASH 标志决定交易的哪一部分由签名者签名。具体来说&#xff0c;它…

Redis分布式锁那点事

锁超时问题 在redis分布式锁中&#xff0c;如果线程A加锁成功了&#xff0c;但是由于业务功能耗时时间很长&#xff0c;超过了设置的超时时间&#xff0c;这时候redis会自动释放线程A加的锁。通常我们加锁的目的是&#xff1a;为了防止访问临界资源时&#xff0c;出现数据异常…

【Python学习记录】Numpy广播机制(broadcast)

✨ 博客主页&#xff1a;小小马车夫的主页 ✨ 所属专栏&#xff1a;Python学习记录 文章目录一、什么是Numpy广播机制二、Numpy广播应用三、Numpy广播规则一、什么是Numpy广播机制 在Numpy、tensorflow、pytorch中数组有一种广播机制(broadcast), 就是针对两个不同形状的数组进…

【Linux】Linux调试器-gdb使用及git命令行

大家好我是沐曦希&#x1f495; 文章目录一.预备知识1.背景2.Linux默认行为3.debug和release区别二.使用三.使用git命令行一.预备知识 1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式Linux gcc/g出来的二进制程序&#xff0c;默认是release模式要使用gdb调试…

前端vue面试题(持续更新中)

Watch中的deep:true是如何实现的 当用户指定了 watch 中的deep属性为 true 时&#xff0c;如果当前监控的值是数组类型。会对对象中的每一项进行求值&#xff0c;此时会将当前 watcher存入到对应属性的依赖中&#xff0c;这样数组中对象发生变化时也会通知数据更新 源码相关 g…

Android 10.0 Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现

1.概述 在进行定制开发的功能需求方面,Launcher3的需求也挺多的,单双层抽屉高斯模糊毛玻璃背景功能也是一个需求功能,最近按照功能需求来开发 双层抽屉高斯模糊毛玻璃效果背景的功能 效果图如图: 2. Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现的核心代码 package…

基于Python logging 实现日志功能模块(即拿即用)

基于Python实现日志功能模块 在项目开发过程,日志文件是十分重要的,尤其对于程序员后期排查软件问题、发现问题bug及使用记录等更是非常重要。 本文使用部分软件版本如下: PyCharm 2019.3 Python 3.7.3 logging 0.5.1.2 logging logging 模块中包含为应用程序和库实现灵…

科研试剂2702973-69-9,endo BCN-PEG12-COOH,endo BCN-PEG12-acid

&#xff08;本品应密封避光&#xff0c;储存于阴凉&#xff0c;干燥&#xff0c;通风处&#xff0c;取用一定要干燥&#xff0c;避免频繁的溶解和冻干&#xff09; ●外观以及性质&#xff1a; endo BCN-PEG12-acid为浅黄色油状&#xff0c;带有 PEG 臂的试剂会增加化合物的亲…

论文投稿指南——中文核心期刊推荐(机械、仪表工业2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

ElasticSearch集群部署系统参数配置调优

内存基本要求 参考书籍:[Elasticsearch: 权威指南]节选https://www.elastic.co/guide/cn/elasticsearch/guide/current/hardware.html 进程数和文件句柄数配置 使用命令查看&#xff1a; vi /etc/security/limits.conf如果没配置&#xff0c;在文件的后面加上配置 * soft n…

burst buffer技术初探

burst buffer是超算中一种作业加速技术&#xff0c;主要解决全球气候模拟预测建模、流体力学分析、磁性融合、天体物理学、生物分子模拟中浪涌型I/O的情况&#xff0c;burst buffer作为前端计算和后端存储之间的缓冲区&#xff0c;它弥合了计算节点的处理速度与存储系统的I/O带…

Nature:重磅,找到终结新冠的药了,关闭ACE2受体,防止所有变体

新冠病毒&#xff0c;通常通过呼吸道感染人类&#xff0c;并造成呼吸系统和人体各个器官的损伤。自2019年底首次爆发至今&#xff0c;新型冠状病毒仍在全球肆虐&#xff0c;对世界经济、社会造成极大的负面影响。随着新冠病毒的大规模流行&#xff0c;新的病毒突变株不断出现&a…

智能座舱开启「万物交互」新革命,隐形冠军们如何突围?

伴随智能座舱在市场端逐步深入消费者心智&#xff0c;从显示、语音到视觉交互&#xff0c;各细分赛道都在蓬勃发展。 高工智能汽车研究院监测数据显示&#xff0c;2022年1-10月&#xff0c;智能座舱前装搭载量同比增长58.06%%&#xff0c;高阶智能座舱同比增长137.61%&#xf…