Android Developers官方文档翻译:Room(一)

使用ROOM在本地数据库存储数据

ROOM提供了一个可以流畅接入SQLite完整能力的抽象层。

应用程序在面对大量结构化数据的时候,对这些数据进行持久化保存在本地是非常有用的。最普遍的应用场景是将相关联的数据缓存起来。这样做的好处是当设备无法连接网络的时候,用户依旧可以浏览已经缓存过的内容,然后在下一次设备重新连接网络的时候,用户改动过的内容将会同步到服务器中。

使用ROOM可以解决这些问题,我们强烈推荐你使用ROOM来代替原生的SQLite。但是,如果你更倾向于直接使用SQLite APIs,可以查阅Save data using SQLite

注意:开始使用ROOM前,请先添加Adding Components to your Project相关依赖到你app module目录的build.gradle文件中。

ROOM主要由3部分组成:

  • Database(数据库):作为数据库对象的持有者,并且为用用程序的持久化关系数据提供主要的接入点。
    使用@Database注解的类应满足以下条件:
  1. 继承RoomDatabase并作为抽象类存在
  2. 在注解中列出与数据库关联的实体列表
  3. 包含一个无参的方法,通过访问这个方法可以获取到用@Dao注解的类
    在运行时,你可以通过调用Room.databaseBuilder())或Room.inMemoryDatabaseBuilder()方法获得Database实例。
  • Entity(实体类):用于定义数据表中的字段。
  • DAO:包含用于访问数据库的方法。

这些组件与应用程序的其他部分的关系如下图所示:

图1 ROOM架构图

以下代码段展示一个实体和一个DAO的使用示例:

User.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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方法在这里就省略了,
// 但是他们在ROOM的使用中是需要有的.
}

UserDao.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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);
}

AppDatabase.java

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

在完成了上面这些代码的编写后,你就可以通过下面的代码来获取database的实例对象了:

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

注意:在实例化AppDatabase对象时应该遵循单例设计模式,因为每个RoomDatabase实例都会产生很大的内存开销,并且很少需要创建多个实例。

ROOM上手使用体验可以在codelabs中的Android Room with a ViewAndroid Persistence进行。想浏览完整ROOM使用例子可以参考Android Architecture Components samples

本文档原文链接:https://developer.android.com/training/data-storage/room/

文章作者: Kevin Wu
文章链接: https://kevinwu.cn/p/c769a52/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KevinWu.CN
支付宝打赏