このメモはα版リリース直後の検証を元に書いています。現在は古い情報もあるため注意してください(AACは公式ドキュメントが充実しているので、そちらに目を通すのが良いと思います)。
Room Persistence Library
Google I/O 2017で発表のあったAndroid Architecture Componentsのひとつ。
SQLiteDatabaseの薄いラッパーのようなものだと理解しています。
実際に少しさわってみたメモ
こちらのチュートリアルを見て実際に少しさわってみましたが、ここに書いてある通りに実装すれば特に困るようなこともなさそうです。
実装でありがちなパターンで、チュートリアルのサンプルコードになかったものをいくつか試してみたのでメモ書きです。
トランザクション管理
トランザクション管理系のメソッドはRoomDatabase
で定義されているので(実際はSupportSQLiteDatabase
の同名メソッドのラッパー)、トランザクション管理も通常のSQLiteDatabase
と同様に可能です。
private MyDatabase mDb;
public void update(MyEntity1 entity1, MyEntity2 entity2) {
mDb.beginTransaction();
try {
mDb.myEntityDao1().update(entity1);
mDb.myEntityDao2().update(entity2);
mDb.setTransactionSuccessful();
} finally {
mDb.endTransaction();
}
}
追記: 正式バージョンの1.0.0では@Transaction
アノテーションが追加されているため、Dao
のメソッドに宣言することでトランザクション管理が可能です。
Entityを使わずにUPDATE/DELETEする
データ操作は基本的にDao
クラスで@Insert
,@Update
,@Delete
アノテーションを使用します。この場合、メソッドの引数はEntityになりますが、条件に合致するレコードの特定カラムだけ更新したいといった場合は、@Query
アノテーションでDMLを記述するほうが簡単です。
@Query is the main annotation used in DAO classes. It allows you to perform read/write operations on a database.
read/writeと書かれているのでなんでもOK。
// Entityを使ったUpdate
@Update
void update(MyEntity entity);
// 条件でUpdate
@Query("UPDATE my_entity SET name = :name WHERE id = :id")
void update(String name, String id);
// Entityを使ったDelete
@Delete
void delete(MyEntity entity);
// 条件でDelete
@Query("DELETE FROM my_entity WHERE id = :id")
void delete(String id);
// 全件Delete
@Query("DELETE FROM my_entity")
void delete();
レコード件数
SQLiteDatabase
をそのまま使った場合はDatabaseUtils#queryNumEntries
等を使うことが多そうですが、こちらも@Query
でそのまま書いて大丈夫でした。検索結果格納用のクラスを定義する必要もなく、そのままlong
で返してくれるようです。
// 件数取得
@Query("SELECT COUNT(*) FROM my_entity")
long count();
// 条件指定
@Query("SELECT COUNT(*) FROM my_entity WHERE name LIKE :name")
long count(String name);
既存のSQLiteDatabaseにRoomを適用する
すでにSQLiteDatabase
を使用しているプロジェクトにRoom
を追加する場合は、Entity
の定義さえ合っていればそのまま既存のDBを使用できます。
注意する点としては、DBのスキーマバージョンを上げることと、上げたバージョンに対応する空のMigration
を定義することです。
例えば、元のスキーマバージョンが5の場合は
- Room
適用時にバージョンを6に上げる
- 5から6へのMigration
クラスを定義する
- Migration5_6#migrate
メソッドの中に処理は書かない
となります。
Room
が管理用のマスタテーブルを追加することでスキーマの構成が変わるので、バージョンを上げる必要があるためです。
感想
今のところ使いやすいです。
SQLiteDatabase
を使ってるということを忘れることがない(過度に隠蔽していない)ので、もともと生SQLばっかり書いてた私のようなおっさんでも直感的にさわれます。
あとクエリがアノテーションに書けるので、コードが見やすくなったと思います。