Android Realm - Passing Realm object using Intent

2019-06-15 14:36发布

I want to pass a realm object from one activity to another. e.g.

Intent intent = new Intent(MainActivity.this, Second.class);
intent.putExtra("Student", studentObj); // studentObj is a realm object
startActivity(intent);

And receive it from the Second activity

Intent i = getIntent();
student = (Student) i.getSerializableExtra("Student");

but this causes a null pointer exception.

java.lang.RuntimeException: Unable to start activity ComponentInfo{testapp.com.tms/tms.testapp.com.tms.view.SecondActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'io.realm.internal.LinkView io.realm.internal.Row.getLinkList(long)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2760)
            at android.app.ActivityThread.access$900(ActivityThread.java:177)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5944)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)

Any idea to fix this?

3条回答
爷的心禁止访问
2楼-- · 2019-06-15 15:16

Your ROW object is null on which you are calling getLinkList(long).

Check whether ROW is serialized or not ? Probably it's not.

查看更多
叼着烟拽天下
3楼-- · 2019-06-15 15:28

Realm currently doesn't support parsing RealmObjects across Intents natively. So you have 2 options :

  1. Send some identifier instead and requery for the object on the other side.

  2. Use a 3rd party library like Parceler. You can see how here: https://realm.io/docs/java/latest/#parceler

查看更多
该账号已被封号
4楼-- · 2019-06-15 15:29

I have the some problem when I tried to pass realmobject to another activity. So, I created a DTO object based in my model, and this one implements Parcelable. Its works, but I know that isn't the better way.

See the implementation:

I have two entities, Student and Disciplines, as code below.

package turbiani.com.br.realmfordummiesandroid.model;

import android.os.Parcel;
import android.os.Parcelable;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Random;
import java.util.UUID;

import io.realm.RealmList;
import io.realm.RealmObject;
import io.realm.annotations.Ignore;
import io.realm.annotations.PrimaryKey;

/**
 * Created by turbiani on 23/07/15.
 */
public class Student extends RealmObject  {

    @PrimaryKey
    private int id;
    private String name;
    private RealmList<Discipline> disciplines;

    public Student(){
        this.id = new Random().nextInt(Integer.MAX_VALUE);
    }

    public Student(String name, RealmList<Discipline> disciplines) {
        this.name = name;
        this.disciplines = disciplines;
        this.id = new Random().nextInt(Integer.MAX_VALUE);
    }

    private Student(Parcel p){
        this.name = p.readString();
        this.disciplines = new RealmList<Discipline>();
        this.id = p.readInt();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public RealmList<Discipline> getDisciplines() {
        return disciplines;
    }

    public void setDisciplines(RealmList<Discipline> disciplines) {
        this.disciplines = disciplines;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

And Discipline class.

package turbiani.com.br.realmfordummiesandroid.model;

import android.os.Parcel;
import android.os.Parcelable;

import java.io.Serializable;

import io.realm.RealmObject;

/**
 * Created by turbiani on 23/07/15.
 */
public class Discipline extends RealmObject {


    private String name;
    private String grade;
    private int    studentId;

    public Discipline(){}

    public Discipline(String name, String grade, int studentId) {
        this.name = name;
        this.grade = grade;
        this.studentId = studentId;
    }

    private Discipline(Parcel p){
        this.name       = p.readString();
        this.grade      = p.readString();
        this.studentId  = p.readInt();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

}

StudentDTO and DisciplineDTO implements Parcelable.

package turbiani.com.br.realmfordummiesandroid.dto;

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.List;

import turbiani.com.br.realmfordummiesandroid.model.Discipline;

/**
 * Created by turbiani on 04/08/15.
 */
public class StudentDTO implements Parcelable{

    private int studentId;
    private String studentName;
    private List<DisciplineDTO> studentDisciplines;

    public StudentDTO(){}

    private StudentDTO(Parcel p){
        this.studentName = p.readString();
        this.studentDisciplines = new ArrayList<DisciplineDTO>();
        p.readTypedList(this.studentDisciplines, DisciplineDTO.CREATOR);
        this.studentId = p.readInt();
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public List<DisciplineDTO> getStudentDisciplines() {
        return studentDisciplines;
    }

    public void setStudentDisciplines(List<DisciplineDTO> studentDisciplines) {
        this.studentDisciplines = studentDisciplines;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    public static final Parcelable.Creator<StudentDTO> CREATOR = new Parcelable.Creator<StudentDTO>(){
        public StudentDTO createFromParcel(Parcel in){
            return new StudentDTO(in);
        }

        public StudentDTO[] newArray(int size){
            return new StudentDTO[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(studentName);
        dest.writeTypedList(studentDisciplines);
        dest.writeInt(studentId);
    }
}


package turbiani.com.br.realmfordummiesandroid.dto;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by turbiani on 04/08/15.
 */
public class DisciplineDTO implements Parcelable {

    private String disciplineName;
    private String disciplineGrade;
    private int    studentId;

    public DisciplineDTO(){}

    private DisciplineDTO(Parcel p){
        this.disciplineName     = p.readString();
        this.disciplineGrade    = p.readString();
        this.studentId          = p.readInt();
    }

    public String getDisciplineName() {
        return disciplineName;
    }

    public void setDisciplineName(String disciplineName) {
        this.disciplineName = disciplineName;
    }

    public String getDisciplineGrade() {

        return disciplineGrade;
    }

    public void setDisciplineGrade(String disciplineGrade) {
        this.disciplineGrade = disciplineGrade;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
goes to
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(disciplineName);
        dest.writeString(disciplineGrade);
        dest.writeInt(studentId);
    }

    public static final Parcelable.Creator<DisciplineDTO> CREATOR = new Parcelable.Creator<DisciplineDTO>(){
        public DisciplineDTO createFromParcel(Parcel in){
            return new DisciplineDTO(in);
        }

        public DisciplineDTO[] newArray(int size){
            return new DisciplineDTO[size];
        }
    };

}

Finally, how i use this in my activity.

studentList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                StudentAdapter adapter = new StudentAdapter();
                Intent intent = new Intent(MainActivity.this, AddDiscipline.class);
                intent.putExtra("StudentDTO", adapter.adaptToStudentDTO(students.get(position)));
                startActivity(intent);
            }
        });

In AddDiscipline activity I get dto object.

@Override
    public void onResume() {
        super.onResume();
        studentDisciplineList           = (ListView) findViewById(R.id.studentDisciplineList);
        btnAddDiscipline                = (Button) findViewById(R.id.btnAddDiscipline);
        final EditText disciplineName   = (EditText) findViewById(R.id.txtDisciplineName);
        final EditText disciplineGrade  = (EditText) findViewById(R.id.txtGrade);

        this.studentDTO = getIntent().getParcelableExtra("StudentDTO");
        studentDisciplineList.setAdapter(getAdapterToStudentDisciplineList());

If you want the complete source code, get in https://github.com/Turbiani/RealmForDummiesAndroid

查看更多
登录 后发表回答