Room来源

Android采用Sqlite作为数据库存储。由于Sqlite代码写起来繁琐且容易出错,因此,开源社区逐渐出现了各种ORM(Object Relational Mapping)库。常见的有ORMLite, GreenDAO等。Google也意识到推出自家ORM库的必要性,于是有了Room,Room同其他ORM库一样,也是在Sqlite上提供了一层封装。

Room相关概念

  1. 概念

    1. Entity:一个Entity对应数据库中的一张表。Entity类是Sqlite表结构对Java类的映射,在Java中可以看作一个Model类。
    2. Dao:数据访问对象(Data Access Objects),我们通过它来访问数据。
  2. 关系:
    1. 一个Entity代表一张表,而每张表都需要一个Dao对象,用于对表进行增删改查;
    2. Room数据库在被实例化之后我们就可以通过数据库实例获取Dao对象,然后通过Dao进行数据库操作。

案例

  1. 分析

    1. 假设我们需要建一张三国历史人物的数据库,保存的是三国的开创者;
    2. 我们需要一个数据库和一张人物表。
  2. 依赖

    def room_version = "2.2.5"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
    
  3. 创建一个关于三国人物的类

    //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 + '\'' +'}';}
    }
    
  4. 创建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();
    }
    
  5. 创建数据库

    //注解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();
    }
    
  6. 使用

    1. 注意事项

      • 需要在工作线程中使用,否则耗时操作将会导致Application崩溃
    2. 获取Dao

      EmperorDao dao = MyDatabase.getDatabaseInstance(this).getEmperorDao();
      
    3. 操作方法

      1. 插入数据

        Emperor caoCao = new Emperor(1, "曹操", "54");
        Emperor liuBei = new Emperor("刘备", "34");
        Emperor sunQuan = new Emperor(4, "孙权", "18");dao.insertEmperor(caoCao, liuBei, sunQuan);
        
      2. 删除数据

        //这个数据必须是查询出来的,否则即便你再构造一个一模一样的数据也删不掉
        Emperor sunQuan = dao.queryEmperorById(4);dao.deleteEmperor(sunQuan);
        
      3. 修改数据

        //这个数据必须是查询出来的,否则即便你再构造一个一模一样的数据也修改不成功
        Emperor liuBei = dao.queryEmperorById(2);
        liuBei.age = "54";dao.updateEmperor(liuBei);
        
      4. 根据条件查询唯一的一个

        Emperor sunQuan = dao.queryEmperorById(1);
        
      5. 根据条件查询多个数据

        List<Emperor> list = dao.queryEmperorsByAge("54");
        
      6. 不设置条件,查询所有数据

        List<Emperor> emperors = dao.queryEmperors();
        

全部代码请点击

最新文章

  1. jmeter的xpath断言 [XPath Assertion]
  2. Spring的datasource配置详解
  3. 【运营】策划朋友圈营销必知的微信八大“封杀”规则
  4. Git——Git基本教程
  5. givemesomecredit数据_你是如何走上数据分析之路的?
  6. REST、SOAP、protocolbuf、thrift、avro
  7. Acision推出“ forgeathon” –第一个WebRTC应用挑战
  8. [No000014A]Linux简介与shell编程
  9. 联通宣布用户存费1300元可获赠21M上网卡
  10. python开发讲解_Python开发系列课程(1) - 初识Python详解
  11. 硬派SUV坦克500撞色款预计年底上市
  12. SQL Server系统数据库–模型数据库
  13. 信息服务器的设置,设置服务器SSH信息
  14. linux brew 安装mysql_mac下通过brew安装mysql
  15. 2021年北京人大附中高考成绩查询,2021北京市地区高考成绩排名查询,北京市高考各高中成绩喜报榜单...
  16. 计算机之父ppt,24计算机之父童年的故事.ppt
  17. Log4j 漏洞最早由阿里云团队发现;HashiCorp 挂牌上市,市值 152 亿美元;Go 1.18 Beta1 发布 | 开源日报
  18. 怎样拿下SUN公司的SCJP认证?
  19. Js 字符串属性及方法
  20. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include pch.h”?

热门文章

  1. 基础命令和脚本练习初识
  2. 【转】App应用内搜索:移动搜索的新入口
  3. 最实用的Mysql安全加固手册
  4. 什么是hadoop?
  5. 计算机的文件夹打不开了,文件夹打不开,详细教您文件夹打不开怎么办
  6. 结构光激光器选择时应该注意的问题二:功率
  7. Chrom浏览器安装CRX插件
  8. 零的突破!6所高校、2所“双非”顶刊发文
  9. python编程语言的缺点-多种编程语言的优缺点梳理
  10. Torch常用函数详解T