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等框架搭配使用。
定義數據庫
數據庫的定義同樣通過註解完成,開發人員需要定義一個繼承自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對象。