Android Room概述

Android Room 第一篇 - 概述

主要是Room功能和组件介绍,还有简单的使用例子

说明:

大部分译自Android Developers的Room官网指导文档第一篇,小部分自己查阅资料和理解后加上。

原文地址:https://developer.android.com/training/data-storage/room/

定义:

Room 在SQLite上提供了一个抽象层,从而在操作SQLite的时候能够流畅的访问数据库。

为什么要有Room:

如果能够实现结构化数据的本地存储,那么对于App来说是一件意义非凡并且好处巨大的事情。

最常见的用图就是缓存相关数据。通过这个方式,当设备无法连接到网络时,用户仍然能够通过离线方式来浏览内容。当设备重新连接网络后,所有内容会通过服务器同步进行变更。由于Room已经为开发者考虑了以上的问题,因此我们强烈推荐使用Room来代替SQLite。然鹅,如果你一意孤行非要用的话,好吧我不拦你,自备梯子,直走右拐谢谢:Save Data Using SQLite.

构成 :

Room主要由三个组件构成:

@Database:包含了数据库holder和一些服务,作为app持久化状态,关系型数据的底层连接的主要连接点。

使用@Database注解的类需要满足以下条件:

  • 集成RoomDatabase的抽象类
  • 包含实体列表,并且通过注解和数据库有所关联
  • 包含一个无参抽象方法并且返回的类需要用@Dao注解

运行时,你可以通过 Room.databaseBuilder()) orRoom.inMemoryDatabaseBuilder())两种方式来创建Database实例。

@Entity:用来注解实体类,@Database通过entities属性引用被@Entitiy注解的类,并利用该类的所有字段作为表的列明来创建表

@Dao:提供访问数据库的方法。

这三个组件之间的关系如下图:

Snip20180707_20.png

使用:

接下来举个小例子,包含了一个简单的数据库,里面有一个实体和一个DAO:

1.添加依赖

Room依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dependencies { 

def room_version = "1.1.1"

implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"

// optional - RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:$room_version"

// optional - Guava support for Room, including Optional and ListenableFuture
implementation "android.arch.persistence.room:guava:$room_version"

// Test helpers
testImplementation "android.arch.persistence.room:testing:$room_version"
}

注意:这个是Room官方文档的依赖项,其中optional的可以不加,因为暂时不需要Rxjava。

2.开始正式体验Room

首先创建实体类 - User.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Entity
public class User {

@PrimaryKey
private int uid;

@ColumnInfo(name = "first_name")
private String firstName;

@ColumnInfo(name = "last_name")
private String lastName;

// Getters and setters are ignored for brevity,
// but they're required for Room to work.
}

然后是Dao - UserDao.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Dao
public interface UserDao {

@Query("SELECT * FROM user")
List<User> getAll();

@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);

@Query("SELECT * FROM user WHERE first_name LIKE :first AND "
+ "last_name LIKE :last LIMIT 1")
User findByName(String first, String last);

@Insert
void insertAll(User... users);

@Delete
void delete(User user);
}

最后是Database类 - AppDatabase.java

1
2
3
4
@Database(entities = {User.class}, version = 1) 
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}

创建完上面三个类,就可以通过下面这段代码创建一个数据库实例

1
2
AppDatabase db = Room.databaseBuilder(getApplicationContext(), 
AppDatabase.class, "database-name").build();

个人总结:

这篇文章主要是介绍了room的组成部分以及简单的使用方式。一句话总结就是,Entity用于建表,Dao用于CRUD,Database用于创建数据库。

接下来我会把Room这一系列的文章都翻译完,最后再通过一个小项目,达到理论实践都掌握的程度,真正理解Room这个数据库框架。

第二篇:Android Room Entity使用

第三篇:Android Room Dao使用

第四篇:Android Room迁移数据库

第五篇:Android Room测试数据库

第六篇:Android Room引用复杂数据

第七篇:Android Room实战

最后,这是我第一次翻译外文技术文章,肯定会有词不达意或者错误的地方,希望大家批评指正,共同进步。


本文结束啦感谢您的阅读