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?
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();
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);
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With