2016-03-21 7 views
2

Realm(0.88.2)とRetrofit 2の組み合わせを使用してオブジェクトを取得しています。 "copyToRealmOrUpdate"を使用してオブジェクトを自分のレルムにコピー/更新しようとすると、 "別のレルムインスタンスからオブジェクトをコピーできません"というメッセージとともにIllegalArgumentExceptionがスローされます。Retrofitが生成したRealmObjectをRealmにコピーできません:IllegalArgumentException

私のレトロフィットコールのonResponse:

public void onResponse(Call<List<Werkbon>> call, Response<List<Werkbon>> response) { 
     if (response.isSuccess()){ 
      Realm realm = Realm.getDefaultInstance(); 
      realm.beginTransaction(); 
      realm.copyToRealmOrUpdate(response.body()); 
      realm.commitTransaction(); 
      realm.close(); 
     } 
    } 

私も同じで、その結果、一つ一つのオブジェクトを追加しようと、response.body()をループのためにこれを試してみましたエラーメッセージ。

とエラースロー:

03-21 15:32:25.754 27465-27465 E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.vl.test, PID: 27465 
    java.lang.IllegalArgumentException: Cannot copy an object from another Realm instance. 
    at io.realm.RealmList.copyToRealmIfNeeded(RealmList.java:246) 
    at io.realm.RealmList.add(RealmList.java:181) 
    at io.realm.WerkbonRealmProxy.copy(WerkbonRealmProxy.java:732) 
    at io.realm.WerkbonRealmProxy.copyOrUpdate(WerkbonRealmProxy.java:696) 
    at io.realm.DefaultRealmModuleMediator.copyOrUpdate(DefaultRealmModuleMediator.java:330) 
    at io.realm.Realm.copyOrUpdate(Realm.java:1395) 
    at io.realm.Realm.copyToRealmOrUpdate(Realm.java:765) 
    at io.realm.Realm.copyToRealmOrUpdate(Realm.java:814) 
    at com.example.app.datamodel.werkbon.Werkbon$1.onResponse(Werkbon.java:81) 
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:66) 
    at android.os.Handler.handleCallback(Handler.java:746) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5443) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

質問は:なぜこのエラーがスローされ、そしてどのように私は私の領域にこれらのオブジェクトを取得できますか?

+1

あなた 'Werkbon.RealmList'のいくつかの要素が、別のレルムによって管理されている、とあなたは、現在のレルムに別のスレッドから管理/作成されたRealmObjectをコピーすることはできません。 – beeender

答えて

3

私の自身の質問に答えると、beeenderのコメントになります。

私のWerkbonオブジェクトにはRealmListRealmLongオブジェクトが含まれています。 RealmLongは単なる長い値のコンテナです。

Retrofitでは、longsRealmLongsに変換するTypeAdapterを追加しました。このアダプタでは、私はすでになど、レルムにRealmLongを追加しました:

mGson = new GsonBuilder() 
      .registerTypeAdapter(RealmLong.class, new RealmLongDeserializer()) 
      ... 
      .create() 

とRealmLongsがレルムに追加されTypeAdapter自体、:

// Don't copy this, wrong version! Scroll down for correct TypeAdapter 
private class RealmLongDeserializer implements JsonDeserializer<RealmLong> { 

    @Override 
    public RealmLong deserialize(JsonElement jsonElement, Type typeOF, 
          JsonDeserializationContext context) throws JsonParseException { 
     Realm realm = Realm.getDefaultInstance(); 
     realm.beginTransaction(); 
     RealmLong rl = realm.createObject(RealmLong.class); 
     rl.setVal(jsonElement.getAsLong()); 
     realm.commitTransaction(); 
     realm.close(); 
     return rl; 
    } 
} 

しかし、私は持っていませんでしたすでにWerkboncopyToRealmOrUpdate機能がこれを後の段階で実行しているため、これをレルムに追加する必要があります。 TypeAdapterはこれだけで、次のように考えられます。

private class RealmLongDeserializer implements JsonDeserializer<RealmLong> { 

    @Override 
    public RealmLong deserialize(JsonElement jsonElement, Type typeOF, 
          JsonDeserializationContext context) throws JsonParseException { 
     RealmLong rl = new RealmLong(jsonElement.getAsLong()); 
     return rl; 
    } 
} 
+1

それが解決されていることを知っておいてよかった! 'RealmLongDeserializer.deserialize'では、Realmインスタンスは閉じられません。閉じてください。それ以外の場合はリークが発生する可能性があります:) – beeender

+0

@beeender:ああ、閉じるのを忘れました。とにかく間違った 'deserialize'関数に入っていましたが、今でも修正されています! – Marcel50506

関連する問題