使用Room将数据保存到本地数据库
Room时Google官方提供的数据库ORM(Object Relational Mapping)框架,使用起来非常方便。Room在SQLite上提供了一个抽象层,以便利用SQLite的全部功能的同时能更加流畅地访问数据库。
处理大量结构化数据的应用可极大地受益于在本地保留的这些数据,最常见的用例是缓存相关数据,这样当设备无法访问网络时,用户仍然可以在离线状态下浏览相应内容。设备之后重新链接到网络后,用户发起的所有内容更改都会同步到服务器。
注意,在Android中使用Room,请在应用的 build.gradle 文件中声明 Room 依赖项。
Room 主要包含3个主要组件:
- 数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点
- Entity :表示数据库中的表
- DAO:包含用于访问数据库的方法
Room不同组件之间的关系
以下代码包含一个实体和一个DAO的示例数据库配置
User.java
1 |
|
2 | public class User { |
3 | |
4 | public int uid; |
5 | |
6 | "first_name") (name = |
7 | public String firstName; |
8 | |
9 | "last_name") (name = |
10 | public String lastName; |
11 | } |
UserDAO.java
1 |
|
2 | public interface UserDao { |
3 | "SELECT * FROM user") ( |
4 | List<User> getAll(); |
5 | |
6 | "SELECT * FROM user WHERE uid IN (:userIds)") ( |
7 | List<User> loadAllByIds(int[] userIds); |
8 | |
9 | "SELECT * FROM user WHERE first_name LIKE :first AND " + ( |
10 | "last_name LIKE :last LIMIT 1") |
11 | User findByName(String first, String last); |
12 | |
13 | |
14 | void insertAll(User... users); |
15 | |
16 | |
17 | void delete(User user); |
18 | } |
AppDataBase.java
1 | .class}, version = 1) (entities = {User |
2 | public abstract class AppDatabase extends RoomDatabase { |
3 | public abstract UserDao userDao(); |
4 | } |
在程序中使用
1 | AppdataBase db = Room.databaseBuilder(appContext,AppDatabase.class,"database-name").build(); |
注意:
注意:如果您的应用在单个进程中运行,则在实例化 AppDatabase 对象时应遵循单例设计模式。每个 RoomDatabase 实例的成本相当高,而您几乎不需要在单个进程中访问多个实例。
如果您的应用在多个进程中运行,请在数据库构建器调用中包含 enableMultiInstanceInvalidation()。这样,如果您在每个进程中都有一个 AppDatabase 实例,就可以在一个进程中使共享数据库文件失效(类似于数据变脏了,通知其它实例?),并且这种失效会自动传播到其他进程中的 AppDatabase 实例。