2015-07-03 2 views
8

Я хочу передать объект области из одной активности в другую. напримерAndroid Realm - Проходящий объект Realm с использованием Intent

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) 

Любая идея исправить это?

+0

Вы можете разместить трассировки стека? –

+0

Отправьте код для класса 'Stundent' –

ответ

0

Ваш объект ROW имеет значение null, на которое вы вызываете getLinkList (long).

Проверьте, не сериализована ли ROW? Наверное, это не так.

8

В настоящее время царство не поддерживает синтаксический анализ объектов RealmObjects изнутри. Итак, у вас есть 2 варианта

1) Отправьте вместо этого идентификатор и запрос для объекта с другой стороны. 2) Используйте стороннюю библиотеку, такую ​​как Parceler. Вы можете видеть, как здесь: https://realm.io/docs/java/latest/#parceler

+0

, какой из двух подходов является лучшим вариантом для вас? – pablobaldez

+0

@ Chhristian Melchior Они все еще единственные способы сделать это? – Harry

0

У меня есть некоторые проблемы, когда я пытался передать realmobject другому действию. Итак, я создал объект DTO, основанный на моей модели, и этот реализует Parcelable. Его работы, но я знаю, что это не лучший способ.

См реализации:

У меня есть две сущности, студент и Дисциплины, как код ниже.

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

Смежные вопросы