Google I/O 2017 で発表された Android Architecture Components のライブラリ群の一つです。 SQLite を扱いやすくするライブラリです。まだα版ですが、今後は Android で SQLite を扱うとなると標準的な方法になるのではないでしょうか。

導入について

Android Studio 3.0で動作の確認ができました。(2017/11/07時点での情報)

基本的にはこちらの公式情報にしたがえば導入できますが、 Room は開発中のため少々内容が古くなっている部分があります。

Google Maven リポジトリの設定は build.gradle が以下のように最初から設定されていたために特に設定する必要はありませんでした。

allprojects {
    repositories {
        google()
        jcenter()
    }
}

また、ドキュメントでは dependencies

  • implementation "android.arch.persistence.room:runtime:1.0.0-beta1"
  • annotationProcessor "android.arch.persistence.room:compiler:1.0.0-beta1"

を追加するとありますが、現在ではバージョンが進んでいるために以下を追加します。

  • implementation "android.arch.persistence.room:runtime:1.0.0-alpha9-1"
  • annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha9-1"

使用上の注意とか

  • メインスレッドからの DB アクセスは UI のフリーズ防止のため、許可するように明示的に設定しない限りできないようになっています。(クラッシュします)

使い方

Database 、 Entity 、 DAO の3つの主要なコンポーネントがあります。これらを用意することで DB を使用することができます。

Database

具象クラスではなく抽象クラスとして RoomDatabase を継承する形で作ります。アノテーションで使用する Entity を、メソッドとしてデータアクセスに使用する DAO を定義します。

@Database(entities = {EntityB.class, EntityA.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    public abstract EntityA_DAO entityA_Dao();

    public abstract EntityB_DAO entityB_Dao();
}

Entity

Entity クラスの各インスタンスがデータベースの1レコードを現すものになります。 Entity クラスごとにテーブルが生成されます。

@Entity
public class EntityA {
    @PrimaryKey(autoGenerate = true)
    private int uid;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }
}

DAO

データベースにアクセスするメソッドを定義する役割を負います。インタフェースとして定義します。クエリはコンパイル時に検証されます。クラス実装はコンパイル時に Room が生成します。

@Dao
public interface EntityA_DAO {
    @Query("SELECT * FROM entityA")
    List<EntityA> getAll();

    @Insert
    void insertAll(EntityA... entities);

    @Query("DELETE FROM entityA")
    void deleteAll();
}

使用例

AppDatabase mDB = Room.databaseBuilder(getApplicationContext(),
                AppDatabase.class, "database-name").build();
List<EntityA> entities = mDB.entityA_Dao().getAll();

感想

まだ正式版にはなっていないので変更が入る可能性を考慮すると、リリースするアプリへの使用には向きません。 SQLiteOpenHelper を使って DB 処理を書くよりも楽だったので、正式版が出るのを楽しみに待ちましょう。

公式情報