Android Realm - Passing Realm object using Intent

后端 未结 3 1131
走了就别回头了
走了就别回头了 2021-01-11 14:59

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\", s         


        
相关标签:
3条回答
  • 2021-01-11 15:34

    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

    0 讨论(0)
  • 2021-01-11 15:38

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

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

    0 讨论(0)
  • 2021-01-11 15:47

    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

    0 讨论(0)
提交回复
热议问题