2017-06-13 65 views
1

我试图在活动之间发送Realm对象。我读过使用parcelable是做到这一点的最佳方式。尽管我试图通过一个意图,但我得到了一个铸造错误。将领域对象作为Parcelable投射出错

添加@Primary Key创建了“找不到主键”错误,所以我省略了它。任何帮助将非常感激!

我的领域对象类:

@org.parceler.Parcel(implementations = { PersonRealmProxy.class }, 
value = Parcel.Serialization.BEAN, 
analyze = { Person.class }) 
public class Person extends RealmObject { 

private String name; 
private int ID; 
private String last_name; 
private String lots_to_write; 
...//getters and setters start here 

从MainActivity传递境界对象:

Intent new_ticket = new Intent (MainActivity.this, AllAddedPeople.class); 
      new_ticket.putExtra("copyRealm", (Parcelable) myRealm); 
      startActivity(new_ticket); 

...在第二届活动接受它:

public class AllAddedPeople extends AppCompatActivity { 

private Realm myRealm; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.add_all_people); 

    myRealm= (Realm) getIntent().getParcelableExtra("MyClass"); 
+0

'活动之间的领域对象。我读过使用parcelable是做这件事的最好方法。“我不确定你在哪里阅读,因为发送** RealmObject **的*最佳方式是发送*它的主键*,然后在其他活动中重新查询它。 – EpicPandaForce

回答

2

好了,所以在XY problem你的原始y的是,即使你说通过意愿发送Person对象,你实际上是试图发送Realm,因为这不是可以理解的,这意味着当您说012时得到ClassCastException是完全有效的,因为它不可分类。


解决Ÿ的问题是,你应该使用Parceler与RealmObject的非托管版本。

@org.parceler.Parcel(/* removing implementations=... */ 
value = Parcel.Serialization.BEAN, 
analyze = { Person.class }) 
public class Person extends RealmObject { 

    // @PrimaryKey // <-- this is obviously missing 
    private int ID; 

    private String name; 
    private String last_name; 
    private String lots_to_write; 
    ...//getters and setters start here 

然后,你可以做

Intent new_ticket = new Intent (MainActivity.this, AllAddedPeople.class); 
     new_ticket.putExtra("person", Parcels.wrap(person.copyFromRealm())); 
     startActivity(new_ticket); 

,你可以收到这样

private Realm myRealm; 
private Person person; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.add_all_people); 

    myRealm = Realm.getDefaultInstance(); 
    // THIS IS WRONG: myRealm = getIntent().getParcelableExtra("MyClass"); 

    person = Parcels.unwrap(getIntent().getParcelableExtra("person")); // <-- unmanaged person obj. 

但是,这实际上是错误解决方案,解决您的X问题是你笑不会从Realm复制RealmObjects,也不应该创建非托管的RealmObject实例;他们应该被主键重新查询。

Intent new_ticket = new Intent (MainActivity.this, AllAddedPeople.class); 
     new_ticket.putExtra("personId", person.getID()); 
     startActivity(new_ticket); 

而且

public class AllAddedPeople extends AppCompatActivity { 

    private Realm myRealm; 
    private Person person; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.add_all_people); 

     myRealm = Realm.getDefaultInstance(); 
     person = myRealm.where(Person.class) 
        .equalTo("ID", getIntent().getIntExtra("personId")) 
        .findFirst(); // <-- managed RealmObject 
     person.addChangeListener(... 
+1

谢谢。锻炼了魅力。出于兴趣,是否有任何情况下推荐parmler与Realm? – BayK

+0

仅当您需要将非托管对象包装到捆绑包中时。例如,对于数据绑定,如果在修改实际完成时(即将修改的非托管对象实际插入Realm时)有“保存”按钮。 – EpicPandaForce

0
Intent new_ticket = new Intent (MainActivity.this,AllAddedPeople.class); 
      new_ticket.putExtra("copyRealm", (Parcelable) myRealm); 
      startActivity(new_ticket); 

你不需要投你的MYREALM参考Parcelable

它应该是:

Intent new_ticket = new Intent (MainActivity.this,AllAddedPeople.class); 
       new_ticket.putExtra("copyRealm", myRealm); 
       startActivity(new_ticket); 

和其他活动

private Realm myRealm; 

应该是

private MyClass myRealm; 

也改变

myRealm= (Realm) getIntent().getParcelableExtra("MyClass"); 

myRealm= (MyClass) getIntent().getParcelableExtra("MyClass");