Jetpack Room使用

Room是安卓官方orm框架,用于简化Sqlite数据库的相关操作。使用Room通常步骤如下

  • 声明依赖
  • 定义数据库表,DAO,数据库类及升级策略
  • 操作数据库

引入依赖

引入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;
    }
...
}

其中需要注意的注解如下

  • @Entity: Room会自动建立数据库表,其中可以通过tableName定义表名,同时可以定义外键、索引、忽略的column
  • @PrimaryKey: 对应数据库表中的primary key
  • @ColumnInfo: 对应数据库表中的column,可以通过name自定义对应的column名
  • @Ignore: 当有多个构造函数时,告诉Room忽略哪些构造函数,针对不想序列化的成员,也可以标记为Ignore

定义DAO

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();
    ....
}

其中主要要做的是

  • 在Database注解中通过entities声明该数据库中的表结构,通过version定义该数据库版本
  • 添加抽象方法返回对应的DAO

操作数据库

通过注解定义数据库,表,dao后,开发人员只需要实例化RoomDatabase对象,然后通过其中的dao操作数据库即可。

database = Room.databaseBuilder(context.getApplicationContext(),
        UsersDatabase.class, "Sample.db")
        .addMigrations(MIGRATION_1_2)
        .build();

监控数据变化

使用RoomDatabase.getInvalidationTracker获取InvalidationTracker对象来监听表数据的改变。一般推荐直接在DAO方法中返回LiveData或者Observable对象。

你可能感兴趣的:(android)