2017-01-31 23 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