2015-07-03 24 views
8

Tôi muốn truyền đối tượng realm từ hoạt động này sang hoạt động khác. ví dụ.Android Realm - Truyền đối tượng Realm bằng Intent

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

Và nhận được nó từ hoạt động Thứ hai

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

nhưng điều này gây ra một con trỏ ngoại lệ null.

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) 

Bất kỳ ý tưởng nào để sửa lỗi này?

+0

Bạn có thể gửi stack trace? –

+0

Đăng mã cho lớp 'Stundent' –

Trả lời

0

Đối tượng ROW của bạn là null mà bạn đang gọi getLinkList (dài).

Kiểm tra xem ROW có được tuần tự hóa hay không? Có lẽ nó không phải.

8

Hiện tại, không hỗ trợ phân tích cú pháp RealmObjects trong toàn bộ Intents. Vì vậy, bạn có 2 tùy chọn

1) Gửi số nhận dạng thay thế và yêu cầu lại đối tượng ở phía bên kia. 2) Sử dụng thư viện của bên thứ 3 như Parceler. Bạn có thể xem cách thực hiện tại đây: https://realm.io/docs/java/latest/#parceler

+0

trong hai phương pháp nào là lựa chọn tốt hơn cho bạn? – pablobaldez

+0

@Christian Melchior Họ vẫn là những cách duy nhất để làm điều đó? – Harry

0

Tôi gặp vấn đề khi cố gắng truyền realmobject sang hoạt động khác. Vì vậy, tôi đã tạo một đối tượng DTO dựa trên mô hình của tôi và đối tượng này triển khai Kiện bưu. Các công trình của nó, nhưng tôi biết đó không phải là cách tốt hơn.

Xem triển khai:

Tôi có hai thực thể, Sinh viên và Kỷ luật, như mã bên dưới.

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

} 

Và lớp Kỷ luật.

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 thực hiện Khớp nối.

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

} 

Cuối cùng, cách tôi sử dụng điều này trong hoạt động của mình.

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

Trong hoạt động AddDiscipline, tôi nhận đối tượng 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()); 

Nếu bạn muốn toàn bộ mã nguồn, nhận được trong https://github.com/Turbiani/RealmForDummiesAndroid

Các vấn đề liên quan