2015-07-03 17 views
8

Voglio passare un oggetto realm da un'attività a un'altra. per esempio.Realm Android - Passaggio dell'oggetto Realm tramite Intent

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

E riceverlo dalla Seconda azione

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

ma questo provoca un'eccezione di puntatore nullo.

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) 

Qualche idea per risolvere il problema?

+0

Puoi pubblicare la traccia dello stack? –

+0

Inserisci il codice per la classe 'Stundent' –

risposta

0

L'oggetto ROW è nullo sul quale si chiama getLinkList (long).

Verificare se ROW è serializzato o no? Probabilmente non lo è.

8

Attualmente Realm non supporta l'analisi nativa di RealmObjects attraverso gli Intenti. Quindi hai 2 opzioni

1) Invia un identificatore invece e una richiesta per l'oggetto sull'altro lato. 2) Utilizzare una libreria di terze parti come Parceler. Potete vedere come: https://realm.io/docs/java/latest/#parceler

+0

quale dei due approcci è l'opzione migliore per te? – pablobaldez

+0

@Christian Melchior Sono ancora gli unici modi per farlo? – Harry

0

Ho qualche problema quando ho provato a passare realmobject a un'altra attività. Quindi, ho creato un oggetto DTO basato sul mio modello e questo implementa Parcelable. Le sue opere, ma so che non è il modo migliore.

vedere l'implementazione:

ho due entità, per studenti e discipline, come il codice di seguito.

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

} 

E classe Disciplina.

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 e DisciplineDTO implementa 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]; 
     } 
    }; 

} 

Infine, come uso questo nella mia attività.

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

Nell'attività AddDiscipline ottengo dto oggetto.

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

Se si desidera che il codice sorgente completo, entrare in https://github.com/Turbiani/RealmForDummiesAndroid