关于Room在项目中怎么使用请看:https://www.jianshu.com/p/5ba249216e83
1.在主线程中使用Room操作数据
Room默认不许在主线中对数据库中的数据进行增删查改等操作,我们需要将操作放在异步线程中去执行,但是有时候我们在数据库中存的只是少量的数据,每次都使用线程来进行操作显得太麻烦,那么就需要设置Room可以在主线中进行操作。
其实要在主线程中使用Room很简单,只需要在build数据库对象时使用allowMainThreadQueries()方法即可
TestRoomDatabase trdb = Room.databaseBuilder(context, TestRoomDatabase.class, "test.db")
.allowMainThreadQueries()
.build();
2.Room对数据库进行版本升级
在使用SQLiteOpenHelper时我们可以在onUpgrade中来执行数据库的升级操作。那么使用Room时怎么做呢?首先vision版本+1,然后在相应实体类中添加需要增加的字段(数据库表增加字段)或者创建一个新的实体类(增加一张表)并引用这个实体。是不是这样就可以了呢?然而并不是,我们需要对新增的字段或者新增的表执行相应的SQL语句才能对数据库进行我们需要的改动,那在Room中怎么去执行这些语句呢?Migration可以完成我们的需求。
Migration的创建,其中1和2表示vision从1升级到2
private Migration mMigration_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//TODO 执行对应的SQL语句
}
};
Migration的使用
TestRoomDatabase trdb = Room.databaseBuilder(context, TestRoomDatabase.class, "test.db")
.addMigrations(mMigration_1_2)
.build();
//同样可以添加多个
1、addMigrations(mMigration_1_2, mMigration_2_3,...)
2、addMigrations(Migration数组)
3.Room根据条件删除
Room中Dao默认提供的Delete标签实现如下:
@Delete
void delete(Test test);
@Delete
void delete(List<Test> tests);
通过以上方法我们只能删除我们传入的相应对象的关键字多对应的数据,如果我们需要根据某个条件来删除的话以上方法的实现就不太友好(只能先查出符合要删除条件的对象,然后再调用以上的方法进行删除);那么有没有更好的实现方式呢?其实Dao中还有@Query标签,虽然看上去标签是用于查询数据的,但是利用该标签可以执行自定义的SQL语句的特性,我们同样可以使用该标签来执行我们的删除语句。
假设test表中有count字段,我们要删除所有count等于某个值的数据,实现如下:
@Query("DELETE FROM test WHERE count = (:count)")
void deleteByCount(int count)
其中(:count)表示对传入参数的引用,左右括号可以不要。
其实有了@Query标签,我们可以执行任意的SQL语句来实现不同的需求。