Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Realm order of insert or update

Tags:

android

realm

I am using Realm in order to persist objects for an Android project. The problem is that I have a composition of many classes and inner fields as classes and lists of them. Something like

class A extends RealmObject{
   @PrimaryKey long id;
   B b;
} 

class B extends RealmObject{
   @PrimaryKey long id;
   RealmList<C> cList;
}

class C extends RealmObject{
  @PrimaryKey long id;
  Date date;
  String value;
  //other fields....
}

The problem is that I want to update some of the fields of C or insert new C in the RealmList of B. In what order should I do that in order to preserve the relations? Can anyone give a real example? Also, Realm doesn't support auto incrementation for IDs and currently I am setting them to currentTimeInMillis when initiated. Is there a better alternative to that?

like image 765
loshkin Avatar asked Jan 31 '17 09:01

loshkin


2 Answers

Let your model classes be

class A extends RealmObject{
   @PrimaryKey
   private long id;
   private B b;

   public A(){
       //required empty constructor
   }

   public A(long id){
       this.id = id;
   }

   public B getB(){
       return b;
   }

   public void setB(B b){
       this.b = b;
   }
} 

class B extends RealmObject{
   @PrimaryKey
   private long id;
   private RealmList<C> cList = new RealmList<>();

   public B(){
       //required empty constructor
   }

   public B(long id){
   this.id = id;
   }

   public RealmList<C> getCList(){
       return cList;
   }

   public void setCList(RealmList<C> cList){
       this.cList = cList;
   }
}

class C extends RealmObject{
  @PrimaryKey 
  private long id;
  private Date date;
  private String value;
  //other fields....

  public C(){
      //required empty constructor
  }

  public C(long id){
      this.id = id;
  }
}

Example - 1: Creating new objects and assigning it according to hierarchy

    Realm realm = Realm.getDefaultInstance();
    realm.beginTransaction();

    C c = new C(id);
    realm.insertOrUpdate(c);

    B b = new B(id);
    RealmList<C> list = b.getcList();
    list.add(c);
    realm.insertOrUpdate(b);

    A a = new A(id);
    a.setB(b);
    realm.insertOrUpdate(a);
    realm.commitTransaction();

Example - 2: Updating existing entry in the DB

    C c = realm.where(C.class).equalTo("id", id).findFirst();
    realm.beginTransaction();
    c.setValue("New Value"); //setter method for value
    c.insertOrUpdate();
    //while updating the existing entry in the database, you need not worry about the hierarchy, Realm will maintain the same hierarchy for updates
    //If you want to copy the existing entry from one object to another, you can use combination of method-1 and method-2
    realm.commitTransaction();
like image 51
Mohammed Atif Avatar answered Oct 23 '22 06:10

Mohammed Atif


It would be something like this:

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        // using managed objects
        A a = realm.where(A.class).findFirst(aId);
        if(a == null) {
           a = realm.createObject(A.class, aId);
        }
        B b = realm.where(B.class).findFirst(bId);
        if(b == null) {
           b = realm.createObject(B.class, bId);
        }
        a.setB(b);

        // in case of managed objects
        for(List<Long> cId : cIds) {
            C c = realm.where(C.class).findFirst(cId);
            if(c == null) {
                c = realm.createObject(C.class, cId);
            }
            if(!b.getCs().contains(c)) { 
                b.getCs().add(c);
            }
        }

        // in case of unmanaged objects of C, adding to managed object B
        b.getCs().addAll(realm.copyToRealmOrUpdate(unmanagedCs));

      ////// adding new unmanaged objects to Realm
        A _a = new A();
        _a.setId(aId);
        realm.insertOrUpdate(_a);

        B _b = new B();
        _b.setId(bId);
        _b.setCs(new RealmList<C>());
        for(C _c : unmanagedCs) {
           _b.add(_c);
        }
        realm.insertOrUpdate(_b);
    }
});
like image 36
EpicPandaForce Avatar answered Oct 23 '22 07:10

EpicPandaForce