详细介绍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

标签:Android,Room数据库
0
投稿

猜你喜欢

  • JAVA如何调用Shell脚本

    2022-11-25 01:13:13
  • Android自定义View实现钟摆效果进度条PendulumView

    2022-07-04 15:50:14
  • SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解

    2022-01-31 05:29:10
  • Android下2d物理引擎Box2d用法简单实例

    2023-09-11 03:18:02
  • java根据List内对象的属性排序方法

    2022-10-25 10:05:44
  • 详解Android USB转串口通信开发基本流程

    2022-01-04 10:12:15
  • Java并发编程学习之Unsafe类与LockSupport类源码详析

    2022-10-21 19:07:01
  • Android使用个推实现三方应用的推送功能

    2022-04-16 08:52:46
  • springboot 使用Spring Boot Actuator监控应用小结

    2021-10-02 10:07:27
  • 详解Java程序启动时-D指定参数是什么

    2021-10-22 07:35:34
  • Mybatis-Plus查询中如何排除标识字段

    2023-11-23 20:38:46
  • IDEA代码规范插件P3C+代码注释模板配置方法

    2022-10-30 17:32:55
  • Spring实战之清除缓存操作示例

    2023-05-31 07:46:26
  • C#实现获取设置IP地址小工具

    2022-08-21 18:06:48
  • 详解Java中的数组与字符串相关知识

    2023-02-10 03:31:10
  • C#中逆变的实际应用场景详解

    2023-12-21 19:59:58
  • java后台批量下载文件并压缩成zip下载的方法

    2021-07-24 21:13:11
  • Android中实现iOS中的毛玻璃效果

    2023-01-27 01:44:14
  • c#初学简单程序实例代码介绍

    2023-11-04 10:53:53
  • Java8 用Lambda表达式给List集合排序的实现

    2023-02-05 17:27:09
  • asp之家 软件编程 m.aspxhome.com