详细介绍Android-Room数据库的使用
作者:人言落日是天涯 发布时间:2022-10-30 09:10:53
前言
Google终于发布了一个和SQLite相关的库了。之前一直都是在SQLite、XUtils、greenDao、Realm这些数据库之间来回折腾。现在终于有一个更“正统”数据库了。
Room是什么?
Room是一个持久性数据库。
Room持久性库提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问。
为什么会选择Room?
前面我也说到了现在也有不少开源的数据库给大家使用,那为什么我们还要去学习使用这个库呢?当然不是我前面说的“正不正统”的原因了。
因为Room有下面几个优点:
① SQL查询在编译时就会验证 - 在编译时检查每个@Query和@Entity等,这就意味着没有任何运行时错误的风险可能会导致应用程序崩溃(并且它不仅检查语法问题,还会检查是否有该表)
② 较少的模板代码
③ 与 LiveData 集成
该如何使用它?
1、在app/build.gradle中添加以下依赖
implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
你可以点击这里查看最新依赖版本号
2、创建JavaBean
@Entity
public class User {
@PrimaryKey(autoGenerate = true)//主键是否自动增长,默认为false
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//这里的getter/setter方法是必须的
//这里的getter/setter方法是必须的
//这里的getter/setter方法是必须的
//重要的事说三遍
}
这里需要使用 @Entity 来注解该类
至少要有一个主键 @PrimaryKey
3、创建Dao
接下来,需要为我们的实体创建DAO。 DAO代表数据访问对象,所以它是告诉我们的数据库如何操作数据的一种方式:
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAllUsers();
@Insert
void insert(User... users);
@Update
void update(User... users);
@Delete
void delete(User... users);
}
使用 @Dao 注解该接口
@Insert , @Update , @Delete , @Query 代表我们常用的 插入 、 更新 、 删除 、 查询 数据库操作
@Insert , @Update , @Delete 可以传入多种不同的参数。例如:
@Insert
void insert(User... users);
@Insert
void insert(User user);
@Insert
void insert(List<User> userLists);
同理, @Query 也可以返回多种不同的类型。
@Query("SELECT * FROM user")
List<User> getAllUsers();
@Query("SELECT * FROM user WHERE id=:id")
User getUser(int id);
@Query("SELECT * FROM user")
Cursor getUserCursor();
当然,除了这些我们还可以传入一些限制符进去。例如,
@Query("SELECT * FROM user WHERE age=:age")
List<User> getUsersByAge(int age);
@Query("SELECT * FROM user WHERE age=:age LIMIT :max")
List<User> getUsersByAge(int max, int... age);
4、创建数据库
@Database(entities = { User.class }, version = 1,exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {
private static final String DB_NAME = "UserDatabase.db";
private static volatile UserDatabase instance;
static synchronized UserDatabase getInstance(Context context) {
if (instance == null) {
instance = create(context);
}
return instance;
}
private static UserDatabase create(final Context context) {
return Room.databaseBuilder(
context,
UserDatabase.class,
DB_NAME).build();
}
public abstract UserDao getUserDao();
}
这里使用 @Database 注解该类并添加了 表名 、 数据库版本 (每当我们改变数据库中的内容时它都会增加),所以这里使用 exportSchema = false
注意:除了添加表映射的类以及和数据库版本外,还要添加 exportSchema = false 否则会报警告。
Error:(10, 17) 警告: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false.
我们抽象了 getUserDao() 方法,这是必要的。
5、使用数据库
我们终于能够操作我们的数据库了。但是所有的操作必须在后台线程中完成。你可以通过使用 AsyncTask , Thread , Handler , RxJava 或其它方式来完成。
如果没有在后台线程执行,并且也没有说明可以在主线程操作的话,就会报以下错误。
Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
例如,我们可以像下面这样插入数据
User user=new User();
user.setName("name1");
user.setAge(18);
UserDatabase
.getInstance(context)
.getUserDao()
.insert(user);
或者这样
List<User> allUsers = UserDatabase
.getInstance(RoomActivity.this)
.getUserDao()
.getAllUsers();
来源:https://www.jianshu.com/p/cfde3535233d


猜你喜欢
- 本文实例为大家分享了Unity实现俄罗斯方块的具体代码,供大家参考,具体内容如下一、使用SpriteRenderer作为小方块图片,创建7种
- 前言最近VS2019正式版发布了,装下来顺便试用了一下C#8.0,最大的看点应该就是可空引用类型了。不过C#8.0仍然处于Beta的状态,而
- DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送至多个客户端。其主
- 先看效果:输入内容,点击生成二维码:点击logo图案:代码:QRCodeUtil:package com.example.administr
- 一.认识IO1.IO的分类(1)BIO:同步阻塞IO(2)NIO:同步非阻塞IO(3)AIO:异步阻塞IO注意: 这里主要介绍BIO2.IO
- 编译篇 研究Chrome ,首先得把它编译出来,这对于后续的代码分析和阅读有很大的帮助,想想自己编译出一个 Chrome 浏览器来使用,那是
- Java泛型映射不同的值类型详解前言:一般来说,开发人员偶尔会遇到这样的情形: 在一个特定容器中映射任意类型的值。然而Java 集合API只
- 前言Date 类Date 类表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。构造方法
- 本文实例为大家分享了Android仿IOS UIAlertView对话框的具体代码,供大家参考,具体内容如下显示效果:我在参考链接中看到了作
- Android 动画实现几种方案在 Android 的 FrameWork 中,为我们提供三种动画的实现方式:逐帧(Frame)动画、视图/
- 前言本文主要给大家介绍了关于Spring Boot优化内嵌Tomcat的相关内容,分享出来供大家参考学习,下面话不多说了,来一看看详细的介绍
- 一、MyBatis缓存介绍正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持1.一级缓存:基于PerpetualC
- 前言本篇内容:提示语的国际化返回,自定义多语言。本文使用aop方式,拦截接口返回的数据,进行转换。正文 先看这次示例教
- 本文实例讲述了Android编程中自定义dialog用法。分享给大家供大家参考,具体如下:dialog是android中提供的一组弹出提示框
- 微服务治理Spring Cloud 工具套件为微服务治理提供了全面的技术支持。这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、
- 本文实例讲述了C#实现Excel导入sqlite的方法,是非常实用的技巧。分享给大家供大家参考。具体方法如下:首先需要引用system.da
- AndroidStudio使用过程中出现的异常异常信息: Gradle sync failed: Unable to start the d
- 一、QQ邮箱打开POP3/SMTP服务上面的服务开启后,会得到一串授权密码在springboot配置中需要用到二、springboot配置I
- Java 17 更新了,作为一个 10 年的 Java 程序员,还是有亿点点兴奋的,Kotlin 的群里面也是各种讨论 Java 的新特性。
- 一. 可变字符串1. 简介在Java中,我们除了可以通过String类创建和处理字符串之外,还可以使用StringBuffer和String