このメモはα版リリース直後の検証を元に書いています。現在は古い情報もあるため注意してください(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ばっかり書いてた私のようなおっさんでも直感的にさわれます。
あとクエリがアノテーションに書けるので、コードが見やすくなったと思います。