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
można zakładać ślad stosu? –
Napisz kod dla 'Stundent' klasy –