2015-07-03 9 views
8

Chcę przekazać obiekt dziedzinowy z jednej aktywności do drugiej. na przykładDziedzina Androida - przekazywanie obiektu Realm za pomocą intencji

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

i odbierania go z drugiej aktywności

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

ale to powoduje wyjątku null pointer.

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) 

Każdy pomysł, aby to naprawić?

+0

można zakładać ślad stosu? –

+0

Napisz kod dla 'Stundent' klasy –

Odpowiedz

0

Twój obiekt ROW ma wartość null, pod którą wywołuje się getLinkList (long).

Sprawdź, czy ROW jest serializowany czy nie? Prawdopodobnie tak nie jest.

8

Realm obecnie nie obsługuje analizowania obiektów Realm Objects w zamierzeniach. Masz więc 2 opcje:

1) Wyślij zamiast tego identyfikator i prośbę o podanie obiektu po drugiej stronie. 2) Użyj biblioteki innej firmy, na przykład Parceler. Możesz zobaczyć, jak tutaj: https://realm.io/docs/java/latest/#parceler

+0

, które z dwóch podejść jest lepszą opcją dla ciebie? – pablobaldez

+0

@ Christian Melchior Czy nadal są to jedyne sposoby na zrobienie tego? – Harry

0

Mam pewien problem, gdy próbowałem przekazać realmobject do innej działalności. Stworzyłem obiekt DTO oparty na moim modelu, a ten implementuje Parcelable. Jego prace, ale wiem, że to nie jest lepszy sposób.

Zobacz realizację:

Mam dwa podmioty, student i dyscyplin, jak kod poniżej.

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

} 

I klasa Dyscypliny.

StudentDTO i DisciplineDTO wdraża 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]; 
     } 
    }; 

} 

Wreszcie, jak mogę tego użyć w mojej działalności.

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

W działaniu AddDiscipline otrzymuję obiekt 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()); 

Jeśli chcesz kompletny kod źródłowy, wsiadaj https://github.com/Turbiani/RealmForDummiesAndroid