2017-06-13 63 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");