Android--Jetpack--数据库Room详解一

news2024/11/23 21:15:28

人生何须万种愁,千里云烟一笑收

一,定义

Room也是一个ORM框架,它在SQLite上提供了一个抽象层,屏蔽了部分底层的细节,使用对象对数据库进行操作,进行CRUD就像对象调用方法一样的简单。

二,角色介绍

谷歌官方给出了一张图片,可以更加直观的了解Room的组成部分:

 从上图可以看出,Room主要由三部分组成:

1,Room Database 数据库:底层连接的主要接入点,创建数据库就靠它了

2,Data Access Objects DAO:在DAO中会有一系列对数据库进行CRUD的方法声明

3,Entity 实体类:是对象与数据表的对应表现,设计实体类,并最后转化为对应的数据表

可以这么理解,我们通过实体类的中Getter和Setter方法对数据进行变更操作,然后Room Database使用DAO中的方法,对表中的数据进行对应的操作。从而屏蔽了繁琐的数据库原生操作。当然这其中使用了注解进行功能的标注。

三,基本使用

1,在app的build.gradle里面添加依赖:

def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"

2,创建表Entity:

@Entity
public class YuanZhen {

    @PrimaryKey(autoGenerate = true)
    private int id;

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

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

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

    @Ignore
    private String sex;

    public YuanZhen(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void setId(int id) {
        this.id = id;
    }

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

    public void setAge(int age) {
        this.age = age;
    }

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

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }

    @Override
    public String toString() {
        return "YuanZhen{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", age=" + age +
            ", address='" + address + '\'' +
            ", sex='" + sex + '\'' +
            '}';
    }
}

上面其中几个注解的含义:

①,@Entity 表示数据库中的表

②,@PrimaryKey 表示主键,autoGenerate 表示自增

③,@ColumnInfo 表示字段,name 表示字段名称

④,@Ignore 表示一个属性不加入生成表的字段,只是临时使用

3,创建Dao:

@Dao
public interface YuanZhenDao {
    
    @Insert
    void insert(YuanZhen... yuanzhens);
    
    @Delete
    void delete(YuanZhen yuanZhen);
    
    @Update
    void update(YuanZhen yuanZhen);
    
    @Query("select * from YuanZhen")
    List<YuanZhen> getAll();
}

这里面包含了增上改查。

其中几个注解的含义:

①,@Dao 表示访问 DB 的方法,需要声明为接口或抽象类,编译阶段将生成 _Impl 实现类,此处则将生成 YuanZhenDao_Impl.java 文件

②,@Insert、@Delete、@Update 、 @Query 分别表示数据库的增删改查方法

4,创建Room Database 数据库:

@Database(entities = {YuanZhen.class},version = 1,exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {

    public abstract YuanZhenDao yuanZhenDao();
    
}

其中几个注解的含义:

①,@Database:表示数据库的定义

②,entities: 表示数据库中包含的表

③,version:表示数据库版本号

5,使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(new Runnable() {
            @Override
            public void run() {
                MyDatabase myDatabase = Room.databaseBuilder(getApplicationContext(),MyDatabase.class,"YuanZhenDb").build();
                YuanZhenDao yuanZhenDao = myDatabase.yuanZhenDao();
                yuanZhenDao.insert(new YuanZhen("yz",20,"淄博市"));
                yuanZhenDao.insert(new YuanZhen("yz1",22,"淄博市"));

                List<YuanZhen> all = yuanZhenDao.getAll();
                System.out.println("输出:"+all.toString());
            }
        }).start();
    }
}

输出结果:

I/System.out: 输出:[YuanZhen{id=1, name='yz', age=20, address='淄博市', sex='null'}, YuanZhen{id=2, name='yz1', age=22, address='淄博市', sex='null'}, YuanZhen{id=3, name='yz', age=20, address='淄博市', sex='null'}

这就是基本使用。

四,条件查询

如果我们想查询某一条数据的话,需要在dao里面增加条件查询:

@Dao
public interface YuanZhenDao {

    @Insert
    void insert(YuanZhen... yuanzhens);

    @Delete
    void delete(YuanZhen yuanZhen);

    @Update
    void update(YuanZhen yuanZhen);

    @Query("select * from YuanZhen")
    List<YuanZhen> getAll();

    @Query("select * from YuanZhen where name like :name")
    YuanZhen getByName(String name);

    @Query("select * from YuanZhen where age in(:ages)")
    List<YuanZhen> getByAges(int[] ages);
}

使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(new Runnable() {
            @Override
            public void run() {
                MyDatabase myDatabase = Room.databaseBuilder(getApplicationContext(),MyDatabase.class,"YuanZhenDb").build();
                YuanZhenDao yuanZhenDao = myDatabase.yuanZhenDao();
                yuanZhenDao.insert(new YuanZhen("yz",20,"淄博市"));
                yuanZhenDao.insert(new YuanZhen("yz1",22,"淄博市"));

            

                YuanZhen yz = yuanZhenDao.getByName("yz");
                System.out.println("输出ByName:"+yz.toString());
                int[] ages ={20,22};
                List<YuanZhen> byAges = yuanZhenDao.getByAges(ages);
                System.out.println("输出ByAges:"+byAges.toString());

            }
        }).start();
    }
}

输出:

I/System.out: 输出ByName:YuanZhen{id=1, name='yz', age=20, address='淄博市', sex='null'}
I/System.out: 输出ByAges:[YuanZhen{id=1, name='yz', age=20, address='淄博市', sex='null'}, YuanZhen{id=2, name='yz1', age=22, address='淄博市', sex='null'}

如果只想查姓名和地址,那么可以新建一个类:

public class YuanZhenNew {

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

    @ColumnInfo(name = "address")
    public String address;

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

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

    public String getName() {
        return name;
    }

    public String getAddress() {
        return address;
    }

    public YuanZhenNew(String name, String address) {
        this.name = name;
        this.address = address;
    }

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

在dao中查询:

@Dao
public interface YuanZhenDao {

    @Insert
    void insert(YuanZhen... yuanzhens);

    @Delete
    void delete(YuanZhen yuanZhen);

    @Update
    void update(YuanZhen yuanZhen);

    @Query("select * from YuanZhen")
    List<YuanZhen> getAll();

    @Query("select * from YuanZhen where name like :name")
    YuanZhen getByName(String name);

    @Query("select * from YuanZhen where age in(:ages)")
    List<YuanZhen> getByAges(int[] ages);

    @Query("select name,address from YuanZhen ")
    public List<YuanZhenNew> getNew();
}

使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(new Runnable() {
            @Override
            public void run() {
                MyDatabase myDatabase = Room.databaseBuilder(getApplicationContext(),MyDatabase.class,"YuanZhenDb").build();
                YuanZhenDao yuanZhenDao = myDatabase.yuanZhenDao();
                yuanZhenDao.insert(new YuanZhen("yz",20,"淄博市"));
                yuanZhenDao.insert(new YuanZhen("yz1",22,"淄博市"));

                
                List<YuanZhenNew> aNew = yuanZhenDao.getNew();
                System.out.println("输出aNew:"+aNew.toString());

            }
        }).start();
    }
}

输出:

I/System.out: 输出aNew:[YuanZhenNew{name='yz', address='淄博市'}, YuanZhenNew{name='yz1', address='淄博市'}]

更多高级用法下章继续讲解

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

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

相关文章

靠谱的车- 华为OD统一考试(C卷)

靠谱的车- 华为OD统一考试&#xff08;C卷&#xff09; OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xf…

HTML+CSS高频面试题

面试题目录 前言1.讲一下盒模型&#xff0c;普通盒模型和怪异盒模型有什么区别2.CSS如何实现居中3.讲一下flex弹性盒布局4.CSS常见的选择器有哪些&#xff1f;优先级5.长度单位px 、em、rem的区别6.position属性的值有哪些7.display属性的值有哪些&#xff0c;分别有什么作用8.…

TCP/IP详解——IP协议,IP选路

文章目录 1. IP 编址1.1 IP 报文头部1.2 进制之间的转换1.3 网络通信1.4 有类 IP 编制的缺陷1.5 变长子网掩码1.6 网关1.7 IP 包分片1.7.1 IP 包分片实例1.7.2 IP 分片注意事项1.7.3 Wireshark 抓取 IP 包分片1.7.4 OmniPeek 抓取 IP 包分片1.7.5 ICMP 不可达差错&#xff08;需…

【生物信息学】scRNA-seq数据分析(一):质控~细胞筛选~高表达基因筛选

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 质控2. 细胞筛选3. 高表达基因筛选 一、实验介绍 质控~ 细胞筛选 ~高表达基因筛选 二、实验环境 1. 配置虚拟环境 可使用如下指令&#xff1a; conda create -n bio python3.…

bugku--社工-初步收集

打开是这么个东西 下面的刷钻软件可以下载 御剑扫一下目录&#xff0c;发现个登录界面 打开刷钻软件抓个包看一下 发现这么两条数据 user 和 pass base64 解码 user:Username: YnVna3VrdUAxNjMuY29t pass:Password: WFNMUk9DUE1OV1daUURaTA 解码发现是163的邮箱账号密码 登…

Vulnhub-DC-2 靶机复现完整过程

环境准备&#xff1a; kali: NAT模式 网段 &#xff1a;192.168.200.0 DC-2: NAT模式 网段 &#xff1a;192.168.200.0 保证靶机和攻击机在一个网段上 信息收集 收集同网段存货主机IP地址 nmap -sP ip地址 arp-scan -l显示错误页面&#xff0c;显然是重定向错误&#xff0c…

独立完成软件的功能的测试(2)

独立完成软件的功能的测试&#xff08;2&#xff09; &#xff08;12.13&#xff09; 1. 对穷举场景设计测试点&#xff08;等价类划分法&#xff09; 等价类划分法的概念&#xff1a; 说明&#xff1a;数据有共同特征&#xff0c;成功失败分类&#xff1a; 有效&#xff1a…

CSS的三大特性(层叠性、继承性、优先级---------很重要)

CSS 有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级。 层叠性 场景&#xff1a;相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突 的问题 原则&#xff1a;  样式冲突&am…

如何从eureka-server上进行服务发现,负载均衡远程调用服务

在spring cloud的maven的pom文件中添加eureka-client的依赖坐标 <!--eureka-client依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependen…

Linux(20):软件安装:原始码与 Tarball

开放源码的软件安装与升级 在Windows系统上面的软件都是一模一样的&#xff0c;【无法修改该软件的源代码】&#xff0c;因此&#xff0c;万一想要增加或者减少该软件的某些功能时&#xff0c;无能为力。。。 Linux 上面的软件几乎都是经过 GPL 的授权&#xff0c;所以每个软件…

99基于matlab的小波分解和小波能量熵函数

基于matlab的小波分解和小波能量熵函数&#xff0c;通过GUI界面导入西储大学轴承故障数据&#xff0c;以可视化的图对结果进行展现。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 99小波分解和小波能量熵函数 (xiaohongshu.com)https://www.xiaohongshu.co…

提升数据可视化:拖拽编辑自动汇总,树形数据表格展示新方式

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 树形结构是一种非常常见的数据结构&#xff0c;它由一组以层次关系排列的节点组成。树的结构类似于自然界中的一…

如何使用内网穿透实现iStoreOS软路由R4S公网远程访问局域网电脑桌面

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址…

【数据库】基于有效性确认的并发访问控制原理及调度流程,乐观无锁模式,冲突较少下的最优模型

使用有效性确认的并发控制 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专…

orb-slam2学习总结

目录 视觉SLAM 1、地图初始化 2、ORB_SLAM地图初始化流程 3、ORB特征提取及匹配 1、对极几何 2、对极约束 &#xff08;epipolar constraint&#xff09; 3、基础矩阵F、本质矩阵E 5、单目尺度不确定性 6、单应矩阵&#xff08;Homography Matrix&#xff09; 6.1 什么是单应矩…

没有明确的报错信息,阿里云国际版Windows服务器无法远程连接

在远程连接失败时&#xff0c;如果您没有收到系统返回的报错信息&#xff0c;并且ECS实例是运行中的状态&#xff0c;然后再根据以下步骤进行排查&#xff1a; 步骤一&#xff1a;使用阿里云Workbench工具测试远程登录 步骤二&#xff1a;检查是否有收到黑洞通知 步骤三&…

Zygote 进程启动过程

首语 在Android系统中&#xff0c;DVM(Dalvik虚拟机)和ART、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程创建的&#xff0c;也可以将其称之为孵化器&#xff0c;它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程。 Zygote进程是在…

AnythingLLM:基于RAG方案构专属私有知识库(开源|高效|可定制)

一、前言 继OpenAI和Google的产品发布会之后&#xff0c;大模型的能力进化速度之快令人惊叹&#xff0c;然而&#xff0c;对于很多个人和企业而言&#xff0c;为了数据安全不得不考虑私有化部署方案&#xff0c;从GPT-4发布以来&#xff0c;国内外的大模型就拉开了很明显的差距…

Oracle(2-17) RMAN Maintenance

文章目录 一、基础知识1、Retention Policy 保留政策2、Recovery Window - Part 1 恢复窗口-第1部分3、Cross Checking 交叉检查4、The CROSSCHECK Command CROSSCHECK命令5、OBSOLETE VS EXPIRED 过时与过期6、Deleting Backups and Copies 删除备份和副本7、The DELETE Comma…

极狐GitLab CI/CD 变量黑魔法之自定义变量

极狐GitLab CI/CD 变量是指一系列的环境变量&#xff0c;用来帮助我们控制 CI/CD Job 或 Pipeline 的行为&#xff0c;存储一些可以复用的信息&#xff0c;避免在 .gitlab-ci.yml 中形成硬编码。 极狐GitLab CI/CD 变量分为预定义变量(predefined CI/CD variables) 和 自定义变…