Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 561
Spaceghost87 Avatar asked Apr 25 '17 19:04

Spaceghost87


2 Answers

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,'.

like image 138
Maher Abuthraa Avatar answered Nov 12 '22 19:11

Maher Abuthraa


You won't be able to easily make a RealmList parcelable, you should either convert it to JSON and parcel it as a string, or use Parceler library with this gist. I think JSON with your custom adapter is actually more reliable, though.

EDIT: with Kotlin, you can follow this approach.

like image 36
EpicPandaForce Avatar answered Nov 12 '22 19:11

EpicPandaForce