JetPack之Room入门

目录

  • 一、简介
    • 1.1 主要组件
    • 1.2 三者关系
  • 二、基础使用
    • 2.1 依赖导入
    • 2.2 Student 实体类定义
    • 2.3 StudentDao 操作接口类
    • 2.4 StudentDataBase 类
    • 2.5 RoomTestActivity 类
  • 三、参考链接


一、简介

JetPack 中的 Room 是一个用于在 SQLite 数据库上提供抽象层的持久性库。它允许开发者在应用中使用更加简洁和流畅的方式来操作数据库,同时提供了一些强大的功能,如编译时的 SQL 检查、类型安全的查询以及 LiveData 和 RxJava 的支持。

Room 的一些重要特性和组件:

  • 1.Entity:Entity 是一个在数据库中代表表的类。每个 Entity 包含一组字段,这些字段对应于表中的列。通过在 Entity 类中定义字段和注解,开发者可以轻松地映射数据库表的结构。
  • 2.DAO(Data Access Object):DAO 是一个包含用于访问数据库的方法的接口或抽象类。开发者可以在 DAO 中定义各种数据库操作,如插入、更新、删除和查询数据的方法。Room 在编译时会生成实现 DAO 的具体类。
  • 3.Database:Database 是一个抽象类,通过注解 @Database 来标记。它是 Room 数据库的主要入口点,用于获取 DAO 实例并管理数据库连接。开发者需要创建一个继承自 RoomDatabase 的子类,并在其中定义数据库的版本号、实体类和 DAO 接口。
  • 4.TypeConverters:TypeConverters 允许开发者自定义将非标准数据类型(如 Date、List 等)转换为 Room 可以存储的数据类型。通过编写自定义的 TypeConverter 类并将其应用于数据库字段,可以实现数据类型的转换和存储。
  • 5.LiveData 和 RxJava 支持:Room 提供了对 LiveData 和 RxJava 的支持,使开发者能够在数据库发生变化时收到通知并更新界面。通过将查询返回的数据类型设置为 LiveData 或 Flowable,可以轻松实现响应式的数据更新。
  • 6.Database Migrations:Room 支持数据库迁移,允许开发者在数据库结构发生变化时保留现有数据。通过编写 Migration 类并将其应用于数据库构建器,可以在数据库版本升级时执行必要的迁移操作。

Room是SQLite数据库的抽象

1.1 主要组件

Room 包含三个主要组件:
Entity:实体类,对应的是数据库的一张表结构,使用注解@Entity标记
Dao:包含访问一系列访问数据库的方法,使用注解@Dao标记
DataBase:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。使用注解@Database标记,另外需要满足以下条件:定义的类必须继承于RoomDatabase的抽象类,在注解中需要定义与数据库相关联的实体类列表。包含一个没有参数的抽象方法并且返回一个Dao对象。
在这里插入图片描述

1.2 三者关系

Entity 类表示数据库中的表结构。
Dao 接口定义与数据库的交互操作。
Database 类表示整个数据库,包含了一组 Entity,并提供了获取 Dao 实例的方法。
通过这种组织结构,可以轻松地定义数据库表结构、操作方法,并将它们组织在一起,以便 Room 可以管理数据库的创建、升级和访问。
在这里插入图片描述


二、基础使用

通过一个简单示例,演示Room如何生成数据库文件以及实现数据库的增删改查等操作。

2.1 依赖导入

    implementation "androidx.room:room-runtime:2.2.0"
    annotationProcessor "androidx.room:room-compiler:2.2.0" // For Java
    // 如果需要在调试时查看 Room 数据库的内容
    debugImplementation "androidx.room:room-testing:2.2.0"

2.2 Student 实体类定义

@Entity
public class Student {
    //主键SQL  唯一的autoGenerate自增长
    @PrimaryKey(autoGenerate = true)
    private int uid;

    @ColumnInfo(name = "name")
    private String name;

    @ColumnInfo(name = "pwd")
    private String pwd;

    @ColumnInfo(name = "address")
    private int address;

    public Student(String name, String pwd, int address) {
        this.name = name;
        this.pwd = pwd;
        this.address = address;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public void setAddress(int address) {
        this.address = address;
    }

    public int getUid() {
        return uid;
    }

    public String getName() {
        return name;
    }

    public String getPwd() {
        return pwd;
    }

    public int getAddress() {
        return address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "uid=" + uid +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

2.3 StudentDao 操作接口类

@Dao
public interface StudentDao {

    @Insert
    void insert(Student... student);

    @Delete
    void delete(Student student);

    @Update
    void update(Student student);

    @Query("select * from Student")
    List<Student> getall();

    //查询一条
    @Query("select * from Student where name like:name")
    Student findByName(String name);


    //查询数组多个记录
    @Query("select * from Student where uid in(:userIds)")
    List<Student> getallId(int[] userIds);

}

2.4 StudentDataBase 类

//exportSchema 导出模式
@Database(entities = {Student.class}, version = 1, exportSchema = false)
public abstract class StudentDataBase extends RoomDatabase {
    //暴露DAO
    public abstract StudentDao userDao();
    
}

2.5 RoomTestActivity 类

public class RoomTestActivity extends AppCompatActivity {

    ActivityViewmodelBinding binding;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityViewmodelBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        //数据库的操作应该是在子线程
        DbTest t = new DbTest();
        t.start();
    }

    //测试刚刚写的三个角色Room数据库  增删改查
    class DbTest extends Thread {
        @Override
        public void run() {
            super.run();
            //数据库的操作都在这里
            StudentDataBase henryDB = Room.databaseBuilder
                    (getApplicationContext(), StudentDataBase.class, "Henry")
                    .allowMainThreadQueries()//可以在主线程执行查询,不建议这么做
                    .fallbackToDestructiveMigration()//数据库改变时,强制升级时,不报错
                    .build();
            StudentDao dao = henryDB.userDao();

            dao.insert(new Student("henry0", "123", 1));
            dao.insert(new Student("henry1", "456", 2));
            dao.insert(new Student("henry2", "789", 3));
            dao.insert(new Student("henry3", "101112", 4));

            //查看全部数据
            List<Student> all = dao.getall();
            Log.d("Henry00", "all = " + all.toString());
            Log.d("Henry00", "---------------------------------");
            //查询名字为henry1的一条数据
            Student henry1 = dao.findByName("henry1");
            Log.d("Henry00", "henry1 查询 = " + henry1.toString());
            Log.d("Henry00", "---------------------------------");

            //查询id为2,3,4的数组数据
            List<Student> allID = dao.getallId(new int[]{2, 3, 4});
            Log.d("Henry00", "allID 查询 = " + allID.toString());
        }

    }
}

输出:

在这里插入图片描述

使用Android Studio DB Browser插件查看数据库信息
在这里插入图片描述


三、参考链接

Android JetPack Room 全方面解读
Android Jetpack架构组件 — Room入坑详解
Jetpack Room 使用及原理解析

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之ACID实现原理

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;Github传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有…

政安晨:【TensorFlow与Keras实战演绎机器学习】专栏 —— 目录

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本篇是作者政安晨的专栏《TensorFlow与Keras…

Appium Inspector 展示设备当前页面

定位元素需要使用appium inspector&#xff0c;之前每次都是从登录页开始&#xff0c;后来发现连接设备的时候只需要去掉appPackage、appActivity即可。 { "platformName": "Android", "platformVersion": "6", "deviceNa…

制作CHM格式的Java学习笔记

1.相关制作工具 Markdown写作工具&#xff1a;Typro 写作md学习笔记 CHM制作工具&#xff1a;妙网电子书制作大师 导出书刊&#xff1a;选CHM格式 2.为什么选择CHM 无限分级性能保证 CHM的本质是HTML&#xff0c;也就是说无论制作的CHM文档中包括了多少内容&#xff0c;打开…

全国土壤阳离子交换量CEC空间分布数据

土壤阳离子交换量&#xff0c;简称CEC&#xff0c;是指土壤胶体所能吸附各种阳离子的总量。土壤阳离子交换量 cation exchange capacity 即CEC 是指土壤胶体所能吸附各种阳离子的总量&#xff0c;其数值以每千克土壤中含有各种阳离子的物质的量来表示&#xff0c;即mol/kg。 中…

景联文科技上新高质量大模型训练数据!

在过去的一年中&#xff0c;人工智能领域呈现出了风起云涌的态势&#xff0c;其中模型架构、训练数据、多模态技术、超长上下文处理以及智能体发展等方面均取得了突飞猛进的发展。 在3月24日举办的2024全球开发者先锋大会的大模型前沿论坛上&#xff0c;上海人工智能实验室的领…

mfc140.dll丢失的解决方法,快速修复win10系统dll问题

在Windows 10操作系统环境下&#xff0c;如果发现系统中关键的动态链接库文件mfc140.dll丢失&#xff0c;可能会引发一系列运行问题。mfc140.dll是Microsoft Foundation Class Library&#xff08;微软基础类库&#xff09;的重要组成部分&#xff0c;对于许多基于该库开发的应…

藏区特产销售平台设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

xilinx FPGA 除法器ip核(divider)的学习和仿真(Vivado)

在设计中&#xff0c;经常出现除法运算&#xff0c;实现方法&#xff1a; 1、移位操作 2、取模取余 3、调用除法器IP核 4、查找表 简单学习除法器IP。 网上很多IP翻译文档&#xff0c;不详细介绍&#xff0c;记录几个重要的点&#xff1a; 1、三种算法模式(不同模式所消耗的资…

短视频矩阵系统---开发源头交付

短视频矩阵系统---开发源头交付 短视频矩阵系统的核心开发步骤包括以下几个方面&#xff1a; 1. 系统设计&#xff1a;根据需求分析&#xff0c;设计出相应的系统架构&#xff0c;包括数据库设计、系统功能模块设计等。 2. 开发基础功能&#xff1a;基础功能包括短视频的上传、…

CI/CD 搭建jenkins基础测试环境构建项目(一)

Jenkins是一个开源的持续集成工具&#xff0c;可以帮助开发团队自动化构建、测试和部署他们的软件项目。通过Jenkins&#xff0c;开发团队可以实现快速、高效地交付软件&#xff0c;并及时发现和解决问题&#xff0c;从而提高团队的生产力和软件质量。持续集成/持续交付&#x…

极光笔记|极光消息推送服务的云原生实践

摘要 极光始终秉承“以开发者为中心”的战略导向&#xff0c;极光推送&#xff08;JPush&#xff09;是国内领先的消息推送服务。极光推送&#xff08;JPush&#xff09;本质上是一种软件付费应用程序&#xff0c;结合当前主流云厂商基础施设&#xff0c;逐渐演进成了云上SaaS…

AP5127 是一款 PWM 工作模式,高效率、外围简单、内置功率管

产品描述 AP5127 是一款 PWM 工作模式,高效率、外围简单、内置功率管&#xff0c;适用于 12-100V 输入的高精度降压 LED 恒流驱动芯片。输出最大功率可达25W&#xff0c;最大电流 2.5A。 AP5127 可实现全亮/半亮功能切换&#xff0c;通过MODE 切换&#xff1a;全亮/半亮/循环模…

基于深度学习的OCR,如何解决图像像素差的问题?

基于深度学习的OCR技术在处理图像像素差的问题时确实面临一定的挑战。图像像素差可能导致OCR系统无法准确识别文本&#xff0c;从而影响其精度和可靠性。尽管已经有一些方法如SRN-Deblur、超分SR和GAN系列被尝试用于解决这个问题&#xff0c;但效果并不理想。然而&#xff0c;这…

前端删除列表数据后页码重置逻辑

问题描述 需要调整页码的例子&#xff1a; 列表一共有10页数据&#xff0c;用户把第10页数据全部删除后&#xff0c;需要把数据重置成上一页&#xff0c;也就是第9页 不用调整页码的例子&#xff1a; 列表一共有1页数据&#xff0c;用户把本页数据全部删除后&#xff0c;页码…

【考研数学二】线性代数重点笔记

目录 第一章 行列式 1.1 行列式的几何意义 1.2 什么是线性相关&#xff0c;线性无关 1.3 行列式几何意义 1.4 行列式求和 1.5 行列式其他性质 1.6 余子式 1.7 对角线行列式 1.8 分块行列式 1.9 范德蒙德行列式 1.10 爪形行列式的计算 第二章 矩阵 2.1 初识矩阵 2…

Git基础(24):分支回退

文章目录 前言放弃已修改的内容分支回退到指定commit 前言 将分支回退到之前的某个版本 开发中&#xff0c;可能开发某个功能不需要了&#xff0c;或者想要回退到之前历史的某个commit&#xff0c; 放弃后来修改的内容。 放弃已修改的内容 如果未提交&#xff0c;直接使用 …

申请GeoTrust数字证书

GeoTrust介绍&#xff1a; 大家应该都不陌生&#xff0c;作为最老资格的一批国际大牌证书&#xff0c;GeoTrust的品牌效益和使用群体非常庞大。在数字证书领域也是当之无愧的龙头地位&#xff0c;作为Symantec和Digicert的子品牌&#xff0c;证书安全性能方面毋庸置疑&#xf…

Android内存优化项目经验分享 兼顾效率与性能

背景 项目上线一段时间后,回顾重要页面 保证更好用户体验及生产效率&#xff0c;做了内存优化和下载导出优化&#xff0c;具体效果如最后的一节的表格所示。 下面针对拍摄流程的两个页面 预览页 导出页优化实例进行介绍&#xff1a; 一.拍摄前预览页面优化 预览效果问题 存在…

TrackballControls是Three.js中的一个相机控件,它允许用户通过鼠标拖拽、滚轮缩放以及键盘移动相机,实现类似于球形的相机旋转操作。

demo案例 TrackballControls是Three.js中的一个相机控件&#xff0c;它允许用户通过鼠标拖拽、滚轮缩放以及键盘移动相机&#xff0c;实现类似于球形的相机旋转操作。这个控件可以用于3D场景中&#xff0c;以提供更好的用户体验。以下是对TrackballControls的入参、出参、方法…