Room的基本使用(一)
2024-05-15 03:25:19
Room来源
Android采用Sqlite作为数据库存储。由于Sqlite代码写起来繁琐且容易出错,因此,开源社区逐渐出现了各种ORM(Object Relational Mapping)库。常见的有ORMLite, GreenDAO等。Google也意识到推出自家ORM库的必要性,于是有了Room,Room同其他ORM库一样,也是在Sqlite上提供了一层封装。
Room相关概念
- 概念
- Entity:一个Entity对应数据库中的一张表。Entity类是Sqlite表结构对Java类的映射,在Java中可以看作一个Model类。
- Dao:数据访问对象(Data Access Objects),我们通过它来访问数据。
- 关系:
- 一个Entity代表一张表,而每张表都需要一个Dao对象,用于对表进行增删改查;
- Room数据库在被实例化之后我们就可以通过数据库实例获取Dao对象,然后通过Dao进行数据库操作。
案例
分析
- 假设我们需要建一张三国历史人物的数据库,保存的是三国的开创者;
- 我们需要一个数据库和一张人物表。
依赖
def room_version = "2.2.5" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version"
创建一个关于三国人物的类
//Entity注解将Emperor类和数据库中的表emperor_table对应起来,tableName可以指定别名,亦可不指定,若不指定就默认使用类名作为表名 @Entity(tableName = "emperor_table") public class Emperor {//PrimaryKey主键,autoGenerate自增长@PrimaryKey(autoGenerate = true)//ColumnInfo用于指定该字段存储在表中的名字,并指定类型@ColumnInfo(name = "id", typeAffinity = ColumnInfo.INTEGER)public int id;@ColumnInfo(name = "emperor_name", typeAffinity = ColumnInfo.TEXT)public String name;@ColumnInfo(name = "age", typeAffinity = ColumnInfo.TEXT)public String age;//Room默认使用这个构造方法操作数据public Emperor(int id, String name, String age) {this.id = id;this.name = name;this.age = age;}//Ignore亦可注解字段,让Room忽略此方法或者字段//由于Room只能识别一个构造器,如果需要定义多个构造器,可以使用Ignore注解让Room忽略这个构造器//Room不会持久化被注解Ignore标记过的字段@Ignorepublic Emperor(String name, String age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Emperor{" +"id=" + id +", name='" + name + '\'' +", age='" + age + '\'' +'}';} }
创建Dao用来操作三国人物表中的数据
//注解Dao @Dao public interface EmperorDao {//插入数据@Insertpublic void insertEmperor(Emperor... emperor);//删除数据@Deletepublic void deleteEmperor(Emperor... emperor);//修改数据@Updatepublic void updateEmperor(Emperor... emperor);//根据条件查询唯一的一个@Query("SELECt * FROM emperor_table WHERE id=:id")public Emperor queryEmperorById(int id);//根据条件查询多个数据@Query("SELECt * FROM emperor_table WHERE age=:age")public List<Emperor> queryEmperorsByAge(String age);//不设置条件,查询所有数据@Query("SELECt * FROM emperor_table")public List<Emperor> queryEmperors(); }
创建数据库
//注解Database告诉系统这是Room数据库对象 //entities指定该数据库有哪些表,多张表就逗号分隔 //version指定数据库版本号,升级时需要用到 //数据库继承自RoomDatabase @Database(entities = {Emperor.class}, version = 1) public abstract class MyDatabase extends RoomDatabase {private static final String DATABASE_NAME = "emperor_db";private static MyDatabase databaseInstance;//结合单例模式完成创建数据库实例public static synchronized MyDatabase getDatabaseInstance(Context context) {if (databaseInstance == null) {databaseInstance = Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, DATABASE_NAME).build();}return databaseInstance;}//将第四步创建的Dao对象以抽象方法的形式返回public abstract EmperorDao getEmperorDao(); }
使用
注意事项
- 需要在工作线程中使用,否则耗时操作将会导致Application崩溃
获取Dao
EmperorDao dao = MyDatabase.getDatabaseInstance(this).getEmperorDao();
操作方法
插入数据
Emperor caoCao = new Emperor(1, "曹操", "54"); Emperor liuBei = new Emperor("刘备", "34"); Emperor sunQuan = new Emperor(4, "孙权", "18");dao.insertEmperor(caoCao, liuBei, sunQuan);
删除数据
//这个数据必须是查询出来的,否则即便你再构造一个一模一样的数据也删不掉 Emperor sunQuan = dao.queryEmperorById(4);dao.deleteEmperor(sunQuan);
修改数据
//这个数据必须是查询出来的,否则即便你再构造一个一模一样的数据也修改不成功 Emperor liuBei = dao.queryEmperorById(2); liuBei.age = "54";dao.updateEmperor(liuBei);
根据条件查询唯一的一个
Emperor sunQuan = dao.queryEmperorById(1);
根据条件查询多个数据
List<Emperor> list = dao.queryEmperorsByAge("54");
不设置条件,查询所有数据
List<Emperor> emperors = dao.queryEmperors();
全部代码请点击
最新文章
- jmeter的xpath断言 [XPath Assertion]
- Spring的datasource配置详解
- 【运营】策划朋友圈营销必知的微信八大“封杀”规则
- Git——Git基本教程
- givemesomecredit数据_你是如何走上数据分析之路的?
- REST、SOAP、protocolbuf、thrift、avro
- Acision推出“ forgeathon” –第一个WebRTC应用挑战
- [No000014A]Linux简介与shell编程
- 联通宣布用户存费1300元可获赠21M上网卡
- python开发讲解_Python开发系列课程(1) - 初识Python详解
- 硬派SUV坦克500撞色款预计年底上市
- SQL Server系统数据库–模型数据库
- 信息服务器的设置,设置服务器SSH信息
- linux brew 安装mysql_mac下通过brew安装mysql
- 2021年北京人大附中高考成绩查询,2021北京市地区高考成绩排名查询,北京市高考各高中成绩喜报榜单...
- 计算机之父ppt,24计算机之父童年的故事.ppt
- Log4j 漏洞最早由阿里云团队发现;HashiCorp 挂牌上市,市值 152 亿美元;Go 1.18 Beta1 发布 | 开源日报
- 怎样拿下SUN公司的SCJP认证?
- Js 字符串属性及方法
- 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include pch.h”?