#概要
Realmを使い始めてまだ数日ですが、パフォーマンスの高さもさることながら、リレーションをオブジェクトの所有関係で記述できる点が気に入りました。
RealmObjectやRelmListをクラスのメンバにするだけでリレーションが作られるのでとても楽ちんで可読性も良いです。
ただRelmListの要素を削除した時にどうなるのかという点が不明だったので実験してみました。
Realmのバージョンは0.88.2。Java環境です。
#実験
まずはクラス定義とログ表示コードです。
(getter/setterは省略)
public class Address extends RealmObject {
private String name;
}
public class AddressBook extends RealmObject{
private String bookName;
private RealmList<Address> list;
}
private void printAddressBook(Realm realm, String bookName){
Log.i(TAG, " --- " + bookName + " ---");
AddressBook book = realm.where(AddressBook.class).equalTo("bookName", bookName).findFirst();
for(Address a : book.getList()){
Log.i(TAG, a.getName());
}
}
private void printAllAddresses(Realm realm){
Log.i(TAG, " --- All Address objects ---");
RealmResults<Address> addesses = realm.where(Address.class).findAll();
for(Address a : addesses){
Log.i(TAG, a.getName());
}
}
Book1に4人分追加します。
Book2は空にしておきます。
realm.beginTransaction();
AddressBook book1 = realm.createObject(AddressBook.class);
AddressBook book2 = realm.createObject(AddressBook.class);
book1.setBookName("Book1");
book2.setBookName("Book2");
Address a1 = realm.createObject(Address.class);
Address a2 = realm.createObject(Address.class);
Address a3 = realm.createObject(Address.class);
Address a4 = realm.createObject(Address.class);
a1.setName("Mike");
a2.setName("Bob");
a3.setName("Nancy");
a4.setName("Jack");
book1.getList().add(a1);
book1.getList().add(a2);
book1.getList().add(a3);
book1.getList().add(a4);
realm.commitTransaction();
ログ出力
--- Book1 ---
Mike
Bob
Nancy
Jack
--- Book2 ---
次にNancyを削除してみます。
ついでにBobもBook1からBook2に移動してみます。
realm.beginTransaction();
AddressBook book1 = realm.where(AddressBook.class).equalTo("bookName", "Book1").findFirst();
AddressBook book2 = realm.where(AddressBook.class).equalTo("bookName", "Book2").findFirst();
Log.i(TAG, "remove Nancy from Book1");
book1.getList().remove(book1.getList().where().equalTo("name", "Nancy").findFirst());
Log.i(TAG, "move Bob from Book1 to Book2");
book2.getList().add(book1.getList().where().equalTo("name", "Bob").findFirst());
book1.getList().remove(book1.getList().where().equalTo("name", "Bob").findFirst());
Log.i(TAG, "commit");
realm.commitTransaction();
printAddressBook(realm, "Book1");
printAddressBook(realm, "Book2");
printAllAddresses(realm);
ログを見るとBobはちゃんとBook2に移動できて、
NancyもBook1から削除されています。
しかしAddress.classでクエリをかけるとまだ実体は残っているのが分かります
remove Nancy from Book1
move Bob from Book1 to Book2
commit
--- Book1 ---
Mike
Jack
--- Book2 ---
Bob
--- All Address objects ---
Mike
Bob
Nancy
Jack
ではAddress.classからJackを削除してみます。
Log.i(TAG, "Remove Jack from Address.class");
realm.beginTransaction();
result = realm.where(Address.class).equalTo("name", "Jack").findAll();
result.remove(0);
Log.i(TAG, "commit");
realm.commitTransaction();;
printAddressBook(realm, "Book1");
printAllAddresses(realm);
JackがAddress.classから削除されました。
Book1のリストから削除する操作はしていませんが、自動的にリンクが削除されたようです。
--- Book1 ---
Mike
--- All Address objects ---
Mike
Bob
Nancy
#まとめ
- RealmListの要素をremoveしても実体が削除されるわけではない。
- クラスからremoveして初めて実体が削除される