Realm モデル・リレーションシップ

■モデル

public class User extends RealmObject {

 private String name;

 private int age;

 @Ignore

 private int sessionId;

 // Standard getters & setters generated by your IDE…

 public String getName() { return name; }

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

 public int getAge() { return age; }

 public void setAge(int age) { this.age = age; }

 public int getSessionId() { return sessionId; }

 public void setSessionId(int sessionId) { this.sessionId = sessionId; }

}


public、protected、privateフィールドや、任意のメソッドの使用も可能。


public class User extends RealmObject {

 public String name;

 public boolean hasLongName() {

  return name.length() > 7;

 }

 @Override

 public boolean equals(Object o) {

  // カスタムのequals()メソッド

 }

}


・データ型

サポートしているデータ型

 boolean

 byte

 short

 int

 long

 float

 double

 String

 Date

 byte[]


byte, short, int, longは全て long として扱われる。


プリミティブラッパークラスの次を使用できる。

これらはnullをセットできる。

 Boolean

 Byte

 Short

 Integer

 Long

 Float

 Double


・必須フィールド

必須フィールドには @Required アノテーションを使用する。

次の型のみ使用できる。

 Boolean

 Byte

 Short

 Integer

 Long

 Float

 Double

 String

 byte[]

 Date


プリミティブ型やRealmList型は、暗黙的に@Requiredとして扱われる。


・保存しないプロパティ

保存しないプロパティには @Ignore アノテーションを使用する。


・オブジェクトの自動更新

RealmObjectは"live"なオブジェクトであり、

データ更新を自動的に反映する。

realm.executeTransaction(new Realm.Transaction() {

 @Override

 public void execute(Realm realm) {

  Dog myDog = realm.createObject(Dog.class);

  myDog.setName("Fido");

  myDog.setAge(1);

 }

});

Dog myDog = realm.where(Dog.class).equalTo("age", 1).findFirst();


realm.executeTransaction(new Realm.Transaction() {

 @Override

 public void execute(Realm realm) {

  Dog myPuppy = realm.where(Dog.class).equalTo("age", 1).findFirst();

  myPuppy.setAge(2);

 }

});


myDog.getAge(); // => 2


・インデックス

インデックスフィールドには @Index アノテーションを使用する。

インデックスを指定できる型は以下

 String

 byte

 short

 int

 long

 boolean

 Date


・プライマリキー

プライマリキーには @PrimaryKey アノテーションを使用する。

プライマリキーを指定できる型は以下

 String

 byte

 short

 int

 long

 Byte

 Short

 Integer

 Long


プライマリキーを指定したモデルには copyToRealmOrUpdate()を

使って追加/更新が出来る。


final MyObject obj = new MyObject();

obj.setId(42);

obj.setName("Fish");

realm.executeTransaction(new Realm.Transaction() {

 @Override

 public void execute(Realm realm) {

  // 次のコメント行のコードでは、単に新たなオブジェクトの作成を試みます

  // realm.copyToRealm(obj);

  // 同じIDのオブジェクトが存在すれば更新を行い、存在しなければ新たに作成を行います

  realm.copyToRealmOrUpdate(obj);

 }

});


■リレーションシップ

public class Email extends RealmObject {

 private String address;

 private boolean active;

 // settersとgettersは省略しています

}

public class Contact extends RealmObject {

 private String name;

 // settersとgettersは省略しています

}


・多対1

public class Contact extends RealmObject {

 public String name;

 private Email email;

 // Other fields…

}


・多対多

public class Contact extends RealmObject {

 public String name;

 public RealmList<Email> emails;

}


・リレーションシップに対するクエリ

public class Person extends RealmObject {

 private String id;

 private String name;

 private RealmList<Dog> dogs;

 // getters and setters

}

public class Dog extends RealmObject {

 private String id;

 private String name;

 private String color;

 // getters and setters

}

RealmResults<Person> persons = realm.where(Person.class)

                  .equalTo("dogs.color", "Brown")

                  .findAll();

persons.get(0).getDogs();


・逆方向のリレーションシップ

PersonオブジェクトからDogオブジェクトをたどることはできるが

DogオブジェクトからPersonオブジェクトをたどることはできない。

@LinkingObjects アノテーションを付加したフィールドを使用することで

関連元のオブジェクトを取得できる。


public class Person extends RealmObject {

 private String id;

 private String name;

 private RealmList<Dog> dogs;

 // getters and setters

}

public class Dog extends RealmObject {

 private String id;

 private String name;

 private String color;

 @LinkingObjects("dogs")

 private final RealmResults<Person> owners;

 // getters and setters

}

@LinkingObjectsアノテーションを付加したフィールドは

final かつ RealmResults<T>型として定義する。