Room是安卓官方orm框架,用于简化Sqlite数据库的相关操作。使用Room通常步骤如下
引入google官方maven仓库
allprojects {
repositories {
google()
jcenter()
}
}
在模块的build.gradle中添加依赖
dependencies{
…
implementation “android.arch.persistence.room:runtime:$rootProject.roomVersion”
annotationProcessor “android.arch.persistence.room:compiler:$rootProject.roomVersion”
androidTestImplementation “android.arch.persistence.room:testing:$rootProject.roomVersion”
}
如果需要测试数据库的升级,还需要导出schema到项目中,需要在模块的build.gradle中如下配置
android {
defaultConfig {
...
// used by Room, to test migrations
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":
"$projectDir/schemas".toString()]
}
}
}
// used by Room, to test migrations
sourceSets {
androidTest.assets.srcDirs +=
files("$projectDir/schemas".toString())
}
...
Room会自动为添加**@Entity**注解的类创建对应的表,类中的成员对应数据库表中的column。下面的代码会关联User类到数据库中的users表
@Entity(tableName = "users")
public class User {
@PrimaryKey
@ColumnInfo(name = "userid")
private String mId;
@ColumnInfo(name = "username")
private String mUserName;
@ColumnInfo(name = "last_update")
private Date mDate;
@Ignore
public User(String userName) {
mId = UUID.randomUUID().toString();
mUserName = userName;
mDate = new Date(System.currentTimeMillis());
}
public User(String id, String userName, Date date) {
this.mId = id;
this.mUserName = userName;
this.mDate = date;
}
...
}
其中需要注意的注解如下
DAO负责定义访问数据库数据的方法,开发人员只需要声明一个由@Dao注解的接口即可,并在其中声明各方法,然后给方法添加相应的sql注解。
@Dao
interface UserDao {
@Query(“SELECT * FROM Users”)
List<User> getUsers();
@Insert(onConflict = OnConflictStrategy.REPLACE)
boolean insertUser(User user);
}
其中Room支持DAO返回多种类型数据,包括基本的java对象,Observable,LiveData,方便与RxJava等框架搭配使用。
另外DAO支持关联查询,比如定义的方法返回的是一个POJO类。
可以通过使用@Embeded注解标记该成员的数据直接在当前POJO类中展开。
可以通过使用@Relation注解标记该成员的数据需要从其它表一起关联查询,被注解的成员必须是List或者Set
数据库的定义同样通过注解完成,开发人员需要定义一个继承自RoomDatabase的抽象类,并为其添加@Database注解
@Database(entities = {User.class}, version = 2)
@TypeConverters(DateConverter.class)
public abstract class UsersDatabase extends RoomDatabase {
private static UsersDatabase INSTANCE;
public abstract UserDao userDao();
....
}
其中主要要做的是
通过注解定义数据库,表,dao后,开发人员只需要实例化RoomDatabase对象,然后通过其中的dao操作数据库即可。
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.addMigrations(MIGRATION_1_2)
.build();
使用RoomDatabase.getInvalidationTracker获取InvalidationTracker对象来监听表数据的改变。一般推荐直接在DAO方法中返回LiveData或者Observable对象。