Search code examples
javaandroidrealm

How to make a RealmList parcelable


i need to implement the Parcelable interface in a Realm model but i have no idea how to write a RealmList in a Parcel

here is my code:

public class SomeModel extends RealmObject implements Parcelable {
  public long id;

  public RealmList<SomeOtherModel> otherModels;

  protected SomeModel(Parcel in) {
   id = in.readLong();
   //here i need to otherModel RealmList from parcel
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeLong(id);
    // here i need to write the otherModels RealmList
  }
  //other methods omitted 
}

pd: the SomeOtherModel class also implements the Parcelable interface and extends RealmObject


Solution

  • Actually you can

    Firstly we are talking about un-managed entities.

    Then you need to initialize realmList with new RealmList<>() . Then add data to it as collection with addAll method.That's it! Here is a sample:

    Person.java:

    package com.entity;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    import java.util.ArrayList;
    
    import io.realm.RealmList;
    
    /**
     * Person
     * Created by Maher Abuthraa on 6/9/17.
     */
    
    public class Person implements Parcelable {
        @PrimaryKey
        private long id;
    
        private String name;
        private RealmList<Dog> mRealmList;
    
        public Person() {
        }
    
        public Person(long id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public long getId() {
            return id;
        }
    
        public Person setId(long id) {
            this.id = id;
            return this;
        }
    
        public String getName() {
            return name;
        }
    
        public Person setName(String name) {
            this.name = name;
            return this;
        }
    
        public RealmList<Dog> getRealmList() {
            return mRealmList;
        }
    
        public Person setRealmList(ArrayList<Dog> dogList) {
            mRealmList = new RealmList<>();
            mRealmList.addAll(dogList);
            return this;
        }
    
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeLong(this.id);
            dest.writeString(this.name);
            dest.writeTypedList(this.mRealmList);
        }
    
        protected Person(Parcel in) {
            this.id = in.readLong();
            this.name = in.readString();
            this.mRealmList = new RealmList<>();
            this.mRealmList.addAll(in.createTypedArrayList(Dog.CREATOR));
        }
    
        public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
            @Override
            public Person createFromParcel(Parcel source) {
                return new Person(source);
            }
    
            @Override
            public Person[] newArray(int size) {
                return new Person[size];
            }
        };
    }
    

    Dog.java:

    package com.entity;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    import io.realm.RealmObject;
    import io.realm.annotations.PrimaryKey;
    
    /**
     * Dog
     * Created by Maher Abuthraa on 6/9/17.
     */
    
    public class Dog extends RealmObject implements Parcelable {
        @PrimaryKey
        private long id;
    
        private String name;
        private int age;
    
        public Dog() {
        }
    
        public Dog(long id, String name, int age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public long getId() {
            return id;
        }
    
        public Dog setId(long id) {
            this.id = id;
            return this;
        }
    
        public String getName() {
            return name;
        }
    
        public Dog setName(String name) {
            this.name = name;
            return this;
        }
    
        public int getAge() {
            return age;
        }
    
        public Dog setAge(int age) {
            this.age = age;
            return this;
        }
    
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeLong(this.id);
            dest.writeString(this.name);
            dest.writeInt(this.age);
        }
    
        protected Dog(Parcel in) {
            this.id = in.readLong();
            this.name = in.readString();
            this.age = in.readInt();
        }
    
        public static final Parcelable.Creator<Dog> CREATOR = new Parcelable.Creator<Dog>() {
            @Override
            public Dog createFromParcel(Parcel source) {
                return new Dog(source);
            }
    
            @Override
            public Dog[] newArray(int size) {
                return new Dog[size];
            }
        };
    }
    

    I hope that may help,'.