2016-08-01 118 views
3

使用情況實例可能有人給一個簡單的使用情況例如爲什麼有人會使用copyToRealm()代替createObject()爲copyToRealm()在領域

時會有人使用copyToRealm()如果有createObject()這是我不明白爲什麼

在這裏的例子,他們看起來幾乎相同https://realm.io/docs/java/latest/

copyToRealm()需要一個非託管對象並將其連接到一個領域,而createObject()直接在領域中創建一個對象。

回答

6

例如,當您將由Rest API生成的對象(從Rest API返回到Realm中)複製時,它非常有用。

+0

所以基本上當我通過網絡接收一個對象,然後我想將它存儲在Realm中? – jhegedus

+0

是的。你會收到JSON,Gson lib將它轉換成POJO對象,並且你將它存儲在Realm中。 – Divers

+0

謝謝,這確實有道理。 – jhegedus

2

realm.createObject()還返回一個RealmProxy實例,並在直接操作,並因此創建N對象來存儲N對象,但是可以使用以下方式僅使用1對象的實例來存儲N對象:

RealmUtils.executeInTransaction(realm -> { 
     Cat defaultCat = new Cat(); // unmanaged realm object 

     for(CatBO catBO : catsBO.getCats()) { 
      defaultCat.setId(catBO.getId()); 
      defaultCat.setSourceUrl(catBO.getSourceUrl()); 
      defaultCat.setUrl(catBO.getUrl()); 
      realm.insertOrUpdate(defaultCat); 
     } 
    }); 

但要真正回答你的問題,copyToRealmOrUpdate()是有意義的,如果你想堅持元素,將它們放在RealmList<T>中,並在另一個RealmObject中設置新管理對象的RealmList。如果您的RealmObject類和下載的分析對象匹配,則會發生這種情況。

@JsonObject 
public class Cat extends RealmObject { 
    @PrimaryKey 
    @JsonField(name="id") 
    String id; 

    @JsonField(name="source_url") 
    String sourceUrl; 

    @JsonField(name="url") 
    String url; 

    // getters, setters; 
} 

final List<Cat> cats = //get from LoganSquare; 
realm.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     Person person = realm.where(Person.class).equalTo("id", id).findFirst(); 
     RealmList<Cat> realmCats = new RealmList<>(); 
     for(Cat cat : realm.copyToRealmOrUpdate(cats)) { 
      realmCats.add(cat); 
     } 
     person.setCats(realmCats); 
    } 
}); 
+0

您的示例中的「copyToRealm」在哪裏? – Divers

+0

@Divers一個合理的問題,所以我也加了一個答案。 – EpicPandaForce