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等框架搭配使用。

定義數據庫

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章