Real-time insert or update order

I use Realm to save objects for an Android project. The problem is that I have the composition of many classes and internal fields like classes and lists of them. Sort of

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 C fields or insert a new C in RealmList of B. In what order should I do this in order to maintain a relationship? Can anyone give a real example? In addition, Realm does not support auto-increment for identifiers, and I currently set them to currentTimeInMillis at startup. Is there a better alternative to this?

+5
source share
2 answers

Let your model classes

 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 them according to the 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 an existing record in the database

  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(); 
+2
source

It will 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); } }); 
+1
source

Source: https://habr.com/ru/post/1263615/


All Articles