2017-01-31 97 views
4

我正在使用領域爲了堅持對象爲Android項目。 問題是我有許多類和內部字段作爲類和它們的列表的組成。 喜歡的東西領域的插入或更新順序

class A extends RealmObject{ 
    @PrimaryKey long id; 
    B b; 
} 

class B extends RealmObject{ 
    @PrimaryKey long id; 
    RealmList<C> cList; 
} 

class C extends RealmObject{ 
    @PrimaryKey long id; 
    Date date; 
    String value; 
    //other fields.... 
} 

的問題是,我想更新一些ç字段或B中的RealmList插入新Ç。在什麼順序我應該這樣做,以保持關係?任何人都可以舉個實例嗎?此外,Realm不支持ID的自動增量,目前我在啓動時將它們設置爲currentTimeInMillis。有更好的選擇嗎?

回答

2

讓你的模型類是

class A extends RealmObject{ 
    @PrimaryKey 
    private long id; 
    private B b; 

    public A(){ 
     //required empty constructor 
    } 

    public A(long id){ 
     this.id = id; 
    } 

    public B getB(){ 
     return b; 
    } 

    public void setB(B b){ 
     this.b = b; 
    } 
} 

class B extends RealmObject{ 
    @PrimaryKey 
    private long id; 
    private RealmList<C> cList = new RealmList<>(); 

    public B(){ 
     //required empty constructor 
    } 

    public B(long id){ 
    this.id = id; 
    } 

    public RealmList<C> getCList(){ 
     return cList; 
    } 

    public void setCList(RealmList<C> cList){ 
     this.cList = cList; 
    } 
} 

class C extends RealmObject{ 
    @PrimaryKey 
    private long id; 
    private Date date; 
    private String value; 
    //other fields.... 

    public C(){ 
     //required empty constructor 
    } 

    public C(long id){ 
     this.id = id; 
    } 
} 

示例 - 1:創建新的對象,並賦予它根據層次

Realm realm = Realm.getDefaultInstance(); 
    realm.beginTransaction(); 

    C c = new C(id); 
    realm.insertOrUpdate(c); 

    B b = new B(id); 
    RealmList<C> list = b.getcList(); 
    list.add(c); 
    realm.insertOrUpdate(b); 

    A a = new A(id); 
    a.setB(b); 
    realm.insertOrUpdate(a); 
    realm.commitTransaction(); 

示例 - 2:在DB更新現有條目

C c = realm.where(C.class).equalTo("id", id).findFirst(); 
    realm.beginTransaction(); 
    c.setValue("New Value"); //setter method for value 
    c.insertOrUpdate(); 
    //while updating the existing entry in the database, you need not worry about the hierarchy, Realm will maintain the same hierarchy for updates 
    //If you want to copy the existing entry from one object to another, you can use combination of method-1 and method-2 
    realm.commitTransaction(); 
+0

'realm.copyToRealmOrUpdate(一);'可以與插件來代替,更快 –

+0

感謝@TimCastelijns不知道這一點,只是閱讀文檔,看起來多少更高效。更新了答案。 –

+1

我既不,EpicPandaForce前段時間告訴我:) –

1

這將是這樣的:

realm.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     // using managed objects 
     A a = realm.where(A.class).findFirst(aId); 
     if(a == null) { 
      a = realm.createObject(A.class, aId); 
     } 
     B b = realm.where(B.class).findFirst(bId); 
     if(b == null) { 
      b = realm.createObject(B.class, bId); 
     } 
     a.setB(b); 

     // in case of managed objects 
     for(List<Long> cId : cIds) { 
      C c = realm.where(C.class).findFirst(cId); 
      if(c == null) { 
       c = realm.createObject(C.class, cId); 
      } 
      if(!b.getCs().contains(c)) { 
       b.getCs().add(c); 
      } 
     } 

     // in case of unmanaged objects of C, adding to managed object B 
     b.getCs().addAll(realm.copyToRealmOrUpdate(unmanagedCs)); 

     ////// adding new unmanaged objects to Realm 
     A _a = new A(); 
     _a.setId(aId); 
     realm.insertOrUpdate(_a); 

     B _b = new B(); 
     _b.setId(bId); 
     _b.setCs(new RealmList<C>()); 
     for(C _c : unmanagedCs) { 
      _b.add(_c); 
     } 
     realm.insertOrUpdate(_b); 
    } 
}); 
+0

這兩個答案都很好。另一個只是更短,是第一個,因此我接受了它。但upvoted你的! – toshkinl