背景
在项目中不可避免的使用数据库, 而三方框架又是五花八门, 在这中我就选择了google Jetpack组件中的Room
创建Dao
在room中Dao是一个接口, 通过@Dao
注解进行修饰
@Dao
public interface TestDao {
}
添加数据
- 通过
@Insert
注解指定方法为添加数据方法, 默认处理模式为忽略当前数据
由于在添加时有可能是一条数据,也有可能是一组数据,所以在这用的是可变数组
@Insert
void add(TestEntity... entities);
- 更改添加数据模式
刚才说了通过
@Insert
注解指定方法默认忽略当前数据, 如果有需求需要替换怎么做呢
通过指定@Insert
注解的onConflict
来解决 OnConflictStrategy.REPLACE
:如果有老的数据存在则会进行替换,如果没有就插入OnConflictStrategy.ROLLBACK
:如果有老的数据存在则会回滚事物,如果没有就插入OnConflictStrategy.ABORT
:如果有老的数据存在则会终止事物,如果没有就插入OnConflictStrategy.FAIL
:如果有老的数据存在则会提示插入数据失败,如果没有就插入OnConflictStrategy.IGNORE
:如果有老的数据存在则忽略当前数据,如果没有就插入
用法如下
@Insert(onConflict = OnConflictStrategy.REPLACE)
void add(TestEntity... entities);
删除数据
通过@Delete
注解指定方法为删除数据方法
@Delete
void delete(TestEntity... entities);
更新数据
通过@Update
注解指定方法为更新数据方法
@Update
void update(TestEntity... entities);
调用逻辑
- 在
AppDatabase
中定义Dao对应的方法
public abstract TestDao testDao();
- 定义Dao接口对应的实现类为单例, 并获取
AppDatabase
对象
public class TestRepo {
private static TestRepo sInstance;
private final AppDatabase mDatabase;
private TestRepo(final AppDatabase database) {
mDatabase = database;
}
public static TestRepo getInstance() {
if (sInstance == null) {
synchronized (TestRepo.class) {
if (sInstance == null) {
AppDatabase database = AppDatabase.getInstance();
sInstance = new TestRepo(database);
}
}
}
return sInstance;
}
}
- 封装方法,并调用Dao中对应的增删改的方法
由于在Dao中add定义的为可变数组, 所以在Dao实现类中会创建两个方法, 一个为单条数据, 一个为多条数据, 以便调用
以下仅为 添加方法的样例, 删除和修改类似
public void addResults(TestEntity entity) {
mDatabase.testDao().add(entity);
}
public void addResults(List<TestEntity> entities) {
int size = entities.size();
TestEntity[] amHeartRateEntities = new TestEntity[size];
for (int i = 0; i < size; i++) {
amHeartRateEntities[i] = entities.get(i);
}
mDatabase.testDao().add(amHeartRateEntities);
}