Android/realm の変更点   

  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • Android/realm へ行く。

#author("2018-03-09T06:41:23+00:00","default:pentacle","pentacle")
API Level 9 (2.3) 以降推奨

* install [#a96fc2e3]

''buid.gradle(Module app)''
 apply plugin: 'realm-android'

''buid.gradle(Project: )''
 classpath "io.realm:realm-gradle-plugin:4.2.0"


* model [#ta5ad0b4]

''models/Country.java''
#pre{{
public class Country extends RealmObject {
    @PrimaryKey
    public int code;
    public String name;
    public RealmList<Prefecture> prefectures; // @OneToManyな感じ
}
}}

''models/Prefecture.java''
#pre{{
public class Prefecture extends RealmObject{
    @PrimaryKey
    public int code;
    public String name;
    public LatLng latlng; // @OneToOneな感じ
}
}}

''models/LatLng.java''
#pre{{
public class LatLng extends RealmObject{
    public double lat;
    public double lng;
}
}}

* activity / application [#yae96e59]

''MainActivity.java''
#pre{{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration
                .Builder()
                .deleteRealmIfMigrationNeeded()
                .build();
        Realm realm = Realm.getInstance(config);
        realm.beginTransaction();

        realm.delete(Country.class);
        realm.delete(Prefecture.class);
        {
            Country j = new Country();
            j.code = 81;
            j.name = "日本";
            Country japan = realm.copyToRealm(j);

            Country china = realm.createObject(Country.class, 86);
            china.name = "中国";

            Prefecture hokkaido = realm.createObject(Prefecture.class, 1);
            hokkaido.name = "北海道";
            LatLng latlng = realm.createObject(LatLng.class);
            latlng.lat = 43.06417;
            latlng.lng = 141.34694;
            hokkaido.latlng = latlng;

            Prefecture aomori = realm.createObject(Prefecture.class, 2);
            aomori.name = "青森";

            japan.prefectures.add(hokkaido);
            japan.prefectures.add(aomori);

            realm.commitTransaction();
        }

        {
            List<Country> countries = realm.where(Country.class).findAll();
            for (Country c : countries) {
                System.out.println(c.name);
                for (Prefecture p : c.prefectures) {
                    System.out.println("-" + p.name);
                    if (p.latlng!=null) {
                        System.out.println("-" + p.latlng.lat);
                        System.out.println("-" + p.latlng.lng);
                    }
                }
            }
        }
        realm.close();
    }
}}

* 注意事項 [#m01b8917]
** managed に関して [#q0ad0c17]
- Country japan = new Country(); のようにすると unmanaged object になり、永続化されない
- Country japan = realm.createObject(Country.class , 81 ) にすると、監視され、変数を変えた時点で永続化予約がされる
- OneToOne / OneToMany 等には managed object を入れないとエラーになる

** OneToMany に関して [#j9864c85]
- japan.prefectures.add(xxx); をすると load 時にも 復元される
- RealmList<xxx> に add すると cascade save されるが、primary key は付かない
- japan.deleteFromRealm(); をしても cascade delete されない