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

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

一,定义

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;@Ignoreprivate 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;}@Overridepublic 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 {@Insertvoid insert(YuanZhen... yuanzhens);@Deletevoid delete(YuanZhen yuanZhen);@Updatevoid 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic 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 {@Insertvoid insert(YuanZhen... yuanzhens);@Deletevoid delete(YuanZhen yuanZhen);@Updatevoid 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic 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;}@Overridepublic String toString() {return "YuanZhenNew{" +"name='" + name + '\'' +", address='" + address + '\'' +'}';}
}

在dao中查询:

@Dao
public interface YuanZhenDao {@Insertvoid insert(YuanZhen... yuanzhens);@Deletevoid delete(YuanZhen yuanZhen);@Updatevoid 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic 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='淄博市'}]

更多高级用法参考文章:Android--Jetpack--数据库Room详解二-CSDN博客

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

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

相关文章

基于YOLOv8深度学习的路面标志线检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

docker容器-compose单机容器编排

目录 yaml文件使用的注意事项 yaml文件的基本数据结构 docker-compose单机容器编排 docker-compose的常用命令 安装docker-compose docker-compose部署nginx nginx文件 yml文件 docker-compose创建镜像和容器 docker-compose构建lnmp nginx文件 mysql文件 php文件…

华为组播配置案例

igmp-snooping主要用于生成二层组播表项&#xff0c;防止交换机全部接口都发组播报文 PC端配置&#xff1a; 组播源配置&#xff1a; R1 interface GigabitEthernet0/0/0 ip address 10.0.0.1 255.255.255.0 pim dm interface GigabitEthernet0/0/1 ip address 192.168.0…

UE5 C++(三)— 基本用法(生命周期、日志、基础变量)

文章目录 生命周期日志打印Outlog打印屏幕打印 基础变量类型FString、FName 和 FText&#xff0c;三者之间的区别 基础数据类型打印 忘记说了每次在Vscode修改后C脚本后&#xff0c;需要编译一下脚本&#xff0c;为了方便我是点击这里编译脚本 生命周期 Actor 生命周期官方文档…

年底总结-基于战略落地的年度经营计划

到了年底&#xff0c;今年不管经济如何&#xff0c;形势多么不好&#xff0c;这个月也要结束2023年了&#xff0c;在这个阶段最关键的是做好今年的总结以及明年的计划。 总结是为了更好地做明年的计划和形势的预判。 借用数据表作为工具&#xff0c;科学理性地对自身公司的经…

基于Java+Swingt学生信息管理系统

基于JavaSwing学生信息管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 1.用户登陆&#xff1a;在帮助按钮处&#xff0c;可以查看登陆账号及密码&#xff1a; 账号admin,密码123456 在未输入的情况下&#xff0c;会提示用户名不能为空&#xff…

广受好评的开源基础大模型最全梳理,你最钟意哪一个?

2023 年即将过去。一年以来&#xff0c;各式各样的大模型争相发布。当 OpenAI 和谷歌等科技巨头正在角逐时&#xff0c;另一方「势力」悄然崛起 —— 开源。 开源模型受到的质疑一向不少。它们是否能像专有模型一样优秀&#xff1f;是否能够媲美专有模型的性能&#xff1f; 迄…

C#实现MQTT over WebSocket

如何在网页端实现MQTT消息的发布和订阅&#xff1f; 实现MQTT功能&#xff0c;可以发布和订阅主题通过WebSocket协议将MQTT消息转发给对应的网页端 带着这个实现思路&#xff0c;采用C#控制台程序实现MQTT服务端功能&#xff0c;web端可以直接使用websocket插件与服务端双向通…

第7章 排序

前言 在这一章&#xff0c;我们讨论数组元素的排序问题。为简单起见&#xff0c;假设在我们的例子中数组只包含整数&#xff0c;虽然更复杂的结构显然也是可能的。对于本章的大部分内容&#xff0c;我们还假设整个排序工作能够在主存中完成&#xff0c;因此&#xff0c;元素的个…

计算机网络知识点

计算机网络中的OSI模型 OSI模型是指“国际标准化组织(SO)”提出的使各种计算机在世界范围内互通互联的网络标准框架简称开放系统互联参考模型 (OSI)。 七层模型&#xff1a;应用层、表示层、会话层、传输层、网络层&#xff08;IP协议、RARP协议、ARP协议、CIDR协议&#xff0…

kafka学习笔记--Topic 数据的存储机制

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

docker小白第五天

docker小白第五天 docker的私有库 有些涉密的信息代码不能放在阿里云的镜像仓库&#xff0c;因此需要构建一个个人内网专属的私有库&#xff0c;将镜像或者容器代码进行推送保存。 下载镜像docker registry 执行代码docker pull registry&#xff0c;用于搭建私服前的准备。…

Linux系统log日志简单清理

系统空间告急 清理log日志 找出当前目录中文件最大的10个文件&#xff1a; cd /var/log du -s ./* | sort -nr | head 系统日志log文件&#xff1a; ll -h /var/log/journal 只保留100MB的日志 journalctl --vacuum-size100M 系统暴力爆破SSH日志&#xff1a; ll -h /var/lo…

初级数据结构(六)——堆

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;五&#xff09;——树和二叉树的概念 | NULL 下一篇-> 1、堆的特性 1.1、定义 堆结构属于完全二叉树的范畴&#xff0c;除了满足完全二叉树的限制之外&#xff0c;还满…

SolidWorks二次开发 C#-读取基于Excel的BOM表信息

SolidWorks二次开发 C#-读取基于Excel的BOM表信息 问题点来源解决方案及思路相关引用链接 问题点来源 这是一位粉丝问的一个问题&#xff0c;他说到: 老师&#xff0c;请问Solidworks二次开发工程图中"基于Excel的材料明细表"怎么读取里面的数据&#xff1f; Ps:这…

leetcode刷题日志-383赎金信

思路&#xff1a;分别用两个map记录ransomNote和magazine中的字符以及出现的次数。最后遍历记录ransomNote的map&#xff0c;如果ransomNote的map中出现的magazine的map中没有出现或者出现的次数小于ransomNote的map则返回false&#xff0c;否则返回true&#xff1b; class So…

arcgis api for js 图层标注文本不显示

在打包arcgis api for js 项目后&#xff0c;更新到现场所有地图文本要素不显示的时候。 可能就是环境设置问题了&#xff0c;需要配置iis或者ngixs里边配置如下类型 iis发布的项目 1、打开iis中发布的网站 2、找到网站的MIME类型如下图 3、添加一下类型&#xff08;一个都不…

机器学习项目精选 第一期:超完整数据科学资料合集

大噶吼&#xff0c;不说废话&#xff0c;分享一波我最近看过并觉得非常硬核的资源&#xff0c;包括Python、机器学习、深度学习、大模型等等。 1、超完整数据科学资料合集 地址&#xff1a;https://github.com/krishnaik06/The-Grand-Complete-Data-Science-Materials Pytho…

【Linux API 揭秘】container_of函数详解

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

1852_bash中的find应用扩展

Grey 全部学习内容汇总&#xff1a; https://github.com/GreyZhang/toolbox 1852_bash中的find应用扩展 find这个工具我用了好多年了&#xff0c;但是是不是真的会用呢&#xff1f;其实不然&#xff0c;否则也不会出现这种总结式的笔记。其实&#xff0c;注意部分小细节之后…