Room理论学习
使用Room将数据保存在本地数据库
Room提供了SQLite之上的一层抽象, 既允许流畅地访问数据库, 也充分利用了SQLite.
处理大量结构化数据的应用, 能从在本地持久化数据中极大受益. 最常见的用例是缓存有关联的数据碎片. 以这种方式, 在设备不能访问网络的时候,
用户依然能够浏览离线内容. 任何用户发起的改变, 都应该在设备重新在线之后同步到服务器.因为Room为你充分消除了这些顾虑, 使用Room而非SQLite是高度推荐的.
添加依赖
为正常使用Room,需添加依赖。添加依赖的方式如下:
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有3个主要构件:
Database: 包含了数据库持有者, 并对于连接应用上持久化的相关数据, 作为一个主要的访问点, 来服务. 注解了@Database的类应该满足以下条件:
1. 继承了RoomDatabase的抽象类; 2. 包含实体列表, 而这些实体与该注解之下数据库关联; 3. 包含一个抽象方法, 无参且返回一个注解了@Dao的类; 在运行时, 你可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()方法请求Database实例.
Entity: 表示数据库内的表.
DAO: 包含用于访问数据库的方法.
下面的代码片断, 包含了一个数据库配置示例, 有一个实体和一个DAO:
User.java
@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.
}
UserDao.java
@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