1 Room Database 简介
Room是SQLite之上的一个抽象层,通过Room,可以更加丝滑的使用SQLite的全部功能。并且,原本在运行期才能发现的SQL语句错误,现在在编译期就会报错,可以缩短SQL语句纠错的时间。
Room主要由以下三个部分组成:
-
DataBase(数据库): 用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder().方法获取DataBase实例。后者表示在内存中存储数据,如果程序结束了数据也就消失了,所以一般还是使用前者。
-
Entity(实体): 可以看成是数据库中的表
-
DAO(数据操作接口): 提供访问数据库的方法
2 简单使用
首先在Gradle中导入相关依赖
xml
// Room (use 1.1.0-alpha1 for latest alpha)
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
2.1 创建Entity
java
@Entity(tableName = "user_data_tab")
public class UserData {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
private int id;
@ColumnInfo(name = "cn_name")
private String cnName;
@ColumnInfo(name = "en_name")
private String enName;
get() && set() && toString()
}
-
每个 Entity对象 都需要使用 @Entity 注解声明,默认使用类名作为表名,也可以指定表名
-
@PrimaryKey 注解用于声明主键,autoGenerate = true,表示它是自增的
-
@ColumnInfo 注解用来给属性设置别名,如果 cnName 属性不设置别名的话,查询的时候可以通过 cnName 进行查询,设置别名后就可以通过设置的 cn_name 进行查询
2.2 创建Dao
java
@Dao
public interface UserDao {
@Query("SELECT * FROM user_data_tab")
List<UserData> getAll();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(UserData... userData);
}
- Dao可以是 interface 也可以是 abstract类,如果是abstract类,需要提供一个参数为RoomDatabase的构造函数。Room会在编译器自动我们生成DAO的实现类
- @Query 注解是DAO中最重要的注解,每一个@Query方法都在编译期生成,如果查询语句有误的话,会在编译期报错,而不是运行期操作失败。
2.3 创建 DataBase
java
@Database(entities = {UserData.class}, version = 1)
public abstract class UserDataBase extends RoomDatabase {
public abstract UserDao getUserDao();
}
由于实例化一个 RoomDatabase 对象的开销是比较大的,所以 DataBase 的使用需要遵循单例模式,只在全局创建一个实例即可。可以创建一个 DataBaseManager 类去进行管理
java
public class UserDataBaseManager {
private static UserDataBaseManager dataBaseManager;
private UserDataBase mUserDataBase;
private UserDao mUserDao;
public static UserDataBaseManager getInstance() {
if (dataBaseManager == null) {
dataBaseManager = new UserDataBaseManager();
}
return dataBaseManager;
}
public void init(Context context) {
if (mUserDataBase == null) {
mUserDataBase = Room.databaseBuilder(
context.getApplicationContext(), UserDataBase.class, user_data.db)
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build();
mUserDao = mUserDataBase.getUserDao();
}
}
public List<UserData> getAll(){
return mUserDao.getAll();
}
public void insertAll(UserData... userData) {
mUserDao.insert(userData);
}
}
-
@Database 注释用于进行声明,同时还需要有相关的 entity对象 ,其中 version 是当前数据库的版本号,如果你对数据相关的实体类结构 进行了更改,这里的 version 就需要加一
-
BookDataBase 除了继承于 RoomDatabase ,还需要实例出相关的 DAO接口
2.3 测试
java
mDataBaseManager = UserDataBaseManager.getInstance();
mDataBaseManager.init(this);
UserData userData = new UserData();
userData.setCnName("");
mDataBaseManager.insertAll(userData);
List<UserData> data = mDataBaseManager.getAll();
Log.d(TAG, "onCreate: data ="+data);