目录

  • 一、Room概述
  • 二、Room的使用
    • 1.添加依赖
    • 2.创建实体类
    • 3.创建数据访问对象 (DAO)
    • 3.创建数据库类(Database)
    • 4.使用
  • 三、Room(增删改查)
    • 3.1增加数据
    • 3.2删除数据
    • 3.3更新数据
    • 3.4查询数据
      • 查询全部数据
      • 查询单个数据(根据主键查询)

一、Room概述

Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:

  • 针对 SQL 查询的编译时验证。
  • 可最大限度减少重复和容易出错的样板代码的方便注解。
  • 简化了数据库迁移路径。
    出于这些方面的考虑,我们强烈建议您使用 Room,而不是直接使用 SQLite API。

Room 包含三个主要组件:

  • 数据库类:用于保存数据库并作为应用持久性数据底层连接的主要访问点。
  • 数据实体:用于表示应用的数据库中的表。
  • 数据访问对象 (DAO):提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。
    数据库类为应用提供与该数据库关联的 DAO 的实例。反过来,应用可以使用 DAO 从数据库中检索数据,作为关联的数据实体对象的实例。此外,应用还可以使用定义的数据实体更新相应表中的行,或者创建新行供插入。图 1 说明了 Room 的不同组件之间的关系。

二、Room的使用

1.添加依赖

dependencies {// Roomimplementation "androidx.room:room-runtime:2.2.5"annotationProcessor "androidx.room:room-compiler:2.2.5"
}

2.创建实体类

1.创建User类

public class User {public int id;public int age;public String name;public String phone;
}

2.添加注解

  • 默认情况下,Room 将类名称用作数据库表名称。如果您希望表具有不同的名称,请设置 @Entity 注解的 tableName 属性。
  • 同样,Room 默认使用字段名称作为数据库中的列名称。如果您希望列具有不同的名称,请将 @ColumnInfo 注解添加到该字段并设置 name 属性。
  • 每个 Room 实体都必须定义一个主键,用于唯一标识相应数据库表中的每一行。执行此操作的最直接方式是使用 @PrimaryKey 为单个列添加注解(注意:如果您需要 Room 为实体实例分配自动 ID,请将 @PrimaryKey 的 autoGenerate 属性设为 true。
  • 默认情况下,Room 会为实体中定义的每个字段创建一个列。 如果某个实体中有您不想保留的字段,则可以使用 @Ignore 为这些字段添加注解,

3.创建数据访问对象 (DAO)

当您使用 Room 持久性库存储应用的数据时,您可以通过定义数据访问对象 (DAO) 与存储的数据进行交互。每个 DAO 都包含一些方法,这些方法提供对应用数据库的抽象访问权限。在编译时,Room 会自动为您定义的 DAO 生成实现。

通过使用 DAO(而不是查询构建器或直接查询)来访问应用的数据库,您可以使关注点保持分离,这是一项关键的架构原则。DAO 还可让您在测试应用时更轻松地模拟数据库访问。

您可以将每个 DAO 定义为一个接口或一个抽象类。对于基本用例,您通常应使用接口。无论是哪种情况,您都必须始终使用 @Dao 为您的 DAO 添加注解。DAO 不具有属性,但它们定义了一个或多个方法,可用于与应用数据库中的数据进行交互。
以下代码是一个简单 DAO 的示例,它定义了在 Room 数据库中插入、删除和选择 User 对象的方法:

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;import java.util.List;@Dao
public interface UserDao {@Insertvoid insertAll(User user);@Deletevoid delete(User user);@Query("SELECT * FROM users")List<User> getAll();
}

3.创建数据库类(Database)

以下代码定义了用于保存数据库的 AppDatabase 类。 AppDatabase 定义数据库配置,并作为应用对持久性数据的主要访问点。数据库类必须满足以下条件:

  • 该类必须带有 @Database 注解,该注解包含列出所有与数据库关联的数据实体的 entities 数组。
  • 该类必须是一个抽象类,用于扩展 RoomDatabase。
  • 对于与数据库关联的每个 DAO 类,数据库类必须定义一个具有零参数的抽象方法,并返回 DAO 类的实例。

import androidx.room.Database;
import androidx.room.RoomDatabase;@Database(entities = User.class,version = 1)
public abstract class UserDatabase extends RoomDatabase {public abstract UserDao getUserDao();
}

4.使用

Database的初始化需要先使用Room.databaseBuilder方法,这个方法几个参数:

AppDatabase db = Room.databaseBuilder(getApplicationContext(),AppDatabase.class, "database-name").build();
  • 参数一:context,我们可以使用Application
  • 参数二:Class,即我们定义的Database的class
  • 参数三:name, 这个参数表示的就是数据库的名字

Room.databaseBuilder方法生成的RoomDatabase.Builder对象调用build方法就生成了AppDatabase对象

然后,您可以使用 AppDatabase 中的抽象方法获取 DAO 的实例,转而可以使用 DAO 实例中的方法与数据库进行交互:

UserDao userDao = db.userDao();
List<User> users = userDao.getAll();

三、Room(增删改查)

3.1增加数据

1.在Dao层写增加的方法
以下代码展示了将一个或多个 User 对象插入数据库的有效 @Insert 方法示例:

@Dao
public interface UserDao {@Insert(onConflict = OnConflictStrategy.REPLACE)public void insertUsers(User... users);@Insertpublic void insertBothUsers(User user1, User user2);@Insertpublic void insertUsersAndFriends(User user, List<User> friends);
}

@Insert 方法的每个参数必须是带有 @Entity 注解的 Room 数据实体类的实例或数据实体类实例的集合。调用 @Insert 方法时,Room 会将每个传递的实体实例插入到相应的数据库表中。

如果 @Insert 方法接收单个参数,则会返回 long 值,这是插入项的新 rowId。如果参数是数组或集合,则该方法应改为返回由 long 值组成的数组或集合,并且每个值都作为其中一个插入项的 rowId。

2.在main方法中调用

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {User user=new User();user.name="小冯";user.age=20;user.phone="123456789";userDao.insertAll(user);}});

运行结果:

3.2删除数据

1.在Dao层中写删除方法

借助 @Delete 注释,您可以定义从数据库表中删除特定行的方法。与 @Insert 方法类似,@Delete 方法接受数据实体实例作为参数。 以下代码展示了一个 @Delete 方法示例,尝试从数据库中删除一个或多个 User 对象:

@Dao
public interface UserDao {@Deletepublic void deleteUsers(User... users);
}

2.在main方法中调用

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {User user=new User();user.id=1;userDao.delete(user);}});

运行结果:

3.3更新数据

1.在Dao层中写更新方法
借助 @Update 注释,您可以定义更新数据库表中特定行的方法。与 @Insert 方法类似,@Update 方法接受数据实体实例作为参数。 以下代码展示了一个 @Update 方法示例,该方法尝试更新数据库中的一个或多个 User 对象:

@Dao
public interface UserDao {@Updatepublic void updateUsers(User... users);
}

Room 使用主键将传递的实体实例与数据库中的行进行匹配。如果没有具有相同主键的行,Room 不会进行任何更改。

@Update 方法可以选择性地返回 int 值,该值指示成功更新的行数。

2.在main方法中调用

        findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {User user=new User();user.id=4;user.name="xiao冯";user.age=22;user.phone="1111111";userDao.update(user);}});

运行结果:

3.4查询数据

查询全部数据

1.在Dao层中写查询方法
使用 @Query 注解,您可以编写 SQL 语句并将其作为 DAO 方法公开。使用这些查询方法从应用的数据库查询数据,或者需要执行更复杂的插入、更新和删除操作。

Room 会在编译时验证 SQL 查询。这意味着,如果查询出现问题,则会出现编译错误,而不是运行时失败。

@Query("SELECT * FROM user")
public User[] loadAllUsers();


2.在main方法中调用

        findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {List<User> userList=userDao.findAllUser();for (User user:userList){Log.i("Usertag","id:   "+user.id+"    name:"+user.name+"   电话号:"+user.phone);}}});

运行结果:

查询单个数据(根据主键查询)

1.增加布局控件

<EditTextandroid:id="@+id/editTextTextPersonName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="76dp"android:layout_marginTop="24dp"android:ems="10"android:hint="请输入查询ID"android:inputType="textPersonName"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/button4" /><Buttonandroid:id="@+id/button5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="24dp"android:layout_marginEnd="44dp"android:text="查询ID"app:layout_constraintEnd_toEndOf="@+id/editTextTextPersonName"app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName" />

2.增加Dao层方法

    @Query("SELECT * FROM users where id= :userId")List<User> findUserById(int userId);

3.在main方法中调用

 EditText editText=findViewById(R.id.editTextTextPersonName);findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {List<User> userList=userDao.findUserById(Integer.parseInt(String.valueOf(editText.getText())));for (User user:userList){Log.i("Usertag","id:   "+user.id+"    name:"+user.name+"   电话号:"+user.phone);}}});

运行结果:

Room框架入门基本上就已经讲完了,更多详情请参考官方文档 Room 官方文档

Android-第十三节04Room框架详解相关推荐

  1. Android 动画框架详解,第 1 部分

    2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...

  2. 【5年Android从零复盘系列之二十】Android自定义View(15):Matrix详解(图文)【转载】

    [转载]本文转载自麻花儿wt 的文章<android matrix 最全方法详解与进阶(完整篇)> [5年Android从零复盘系列之二十]Android自定义View(15):Matri ...

  3. Android 动画框架详解

    Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...

  4. Linux内核Thermal框架详解十二、Thermal Governor(2)

    本文部分内容参考 万字长文 | Thermal框架源码剖析, Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客, "热散由心静,凉生为室空" ...

  5. Linux内核Thermal框架详解十四、Thermal Governor(4)

    本文部分内容参考 万字长文 | Thermal框架源码剖析, Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客, "热散由心静,凉生为室空" ...

  6. Qt图形视图框架详解-安晓辉-专题视频课程

    Qt图形视图框架详解-12227人已学习 课程介绍         介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...

  7. 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型

    1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性, ...

  8. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  9. WebDriver自动化测试框架详解

    webDriver自动化测试框架详解 一. 简介 WebDriver API相对于Selenium Remote Control API来说,虽然同样是控制浏览器,但它的编程接口更加简洁 WebDri ...

最新文章

  1. Linux下二进制文件安装MySQL
  2. Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)
  3. cocos2d-x-3.x 动作(5)序列动作
  4. 高精地图中地面标识识别技术历程与实践
  5. ubuntu 开机自动挂在windows下的分区
  6. requests请求报字符编码异常信息
  7. go 变量大写_和我一起学Go系列:Go基本语法概览
  8. Atitit data fmt sumup 常用的数据交换格式 标准 目录 1. 分类标准 2 1.1. 按照结构化与非结构化分类 2 1.2. 按照资料性质分类常见的数据格式txt ,do
  9. 舞蹈课(dancingLessons)
  10. 游戏加加:科学的算法+公平的引擎=最真实的BenchMark
  11. python对数据集处理,绘制世界地图
  12. 5分钟搞定产品结构图
  13. 开发必装最实用工具软件与网站
  14. Android内存泄漏检测工具LeakCanary
  15. 【已解决】linux开启端口 error: unrecognized arguments: -add-port=8080/tcp
  16. linux如何配置php环境,linux如何配置php环境
  17. 自组网(无人机FANET)简单介绍
  18. 为数据科学和机器学习选择合适的笔记本电脑,完成数据科学和机器学习任务的完美笔记本电脑的 20 个必要条件
  19. 《Arduino开发实战指南:LabVIEW卷》6.5 基于Arduino控制6自由度机械臂
  20. 孩子学习机怎么买?3款爆款学习机详细测评

热门文章

  1. 【云原生之kubernetes实战】在k8s环境下部署BookBrowser电子书浏览器
  2. 一口气带你学会Redis升级后的几种数据类型,效率daydayup
  3. Error: While importing ‘run_app_dev‘, an ImportError was raised.
  4. 搭建jpress个人博客
  5. Frenet坐标系与Cartesian坐标系互转(三):应用示例
  6. jay chou歌词 文本下载数据下载
  7. 【已解决】TF_REPEATED_DATA ignoring data with redundant timestamp for frame
  8. DP动态规划--乡村邮局问题-Post Office(POJ-1160)python
  9. 关于考教师资格证的一些建议——笔试篇
  10. 20分钟让你了解OpenGL——OpenGL全流程详细解读