【问题标题】:Android Realm - Passing Realm object using IntentAndroid Realm - 使用 Intent 传递 Realm 对象
【发布时间】:2015-09-20 17:38:45
【问题描述】:

我想将领域对象从一个活动传递到另一个活动。例如

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

并从第二个活动中接收它

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

但这会导致空指针异常。

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)

有办法解决这个问题吗?

【问题讨论】:

  • 你能发布堆栈跟踪吗?
  • 发布Stundent类的代码

标签: android android-intent serialization realm


【解决方案1】:

您正在调用 getLinkList(long) 的 ROW 对象为空。

检查 ROW 是否被序列化?应该不是吧。

【讨论】:

    【解决方案2】:

    Realm 目前不支持原生跨 Intent 解析 RealmObject。所以你有两个选择:

    1. 改为发送一些标识符并重新查询另一端的对象。

    2. 使用像 Parceler 这样的第三方库。您可以在这里查看:https://realm.io/docs/java/latest/#parceler

    【讨论】:

    • 这两种方法中哪一种更适合您?
    • @Christian Melchior 他们仍然是唯一的方法吗?
    【解决方案3】:

    当我尝试将领域对象传递给另一个活动时,我遇到了一些问题。所以,我基于我的模型创建了一个 DTO 对象,这个对象实现了 Parcelable。它的作品,但我知道这不是更好的方法。

    查看实现:

    我有两个实体,Student 和 Disciplines,代码如下。

    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;
        }
    
    }
    

    还有纪律课。

    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 和 DisciplineDTO 实现 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];
            }
        };
    
    }
    

    最后,我如何在我的活动中使用它。

    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);
                }
            });
    

    在 AddDiscipline 活动中,我得到 dto 对象。

    @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());
    

    如果你想要完整的源代码,请进入https://github.com/Turbiani/RealmForDummiesAndroid

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多