2017-04-18 30 views
-1

各RealmResultsデータをRESTエンドポイントに投稿し、送信が成功した場合はそのデータを削除したいと考えています。foreach RealmResultsとAndroidで削除

次のコードを実行すると、送信は成功しますが、削除に失敗します。
Response()target.deleteFromRealm()を使用しようとしましたが、IllegalStateExceptionが発生しました。

java.lang.IllegalStateException: Realm access from incorrect thread. 
     Realm objects can only be accessed on the thread they were created. 

targetを削除するにはどうすればよいですか? (レルムのJava 3.1.2を使用して2.2.0をレトロフィット)

RealmResults<Model> results = realm.where(Model.class).findAll(); 
for (final Model target: results){ 
    Call<Void> task = restInterface.post(gson.toJson(target)); 
    task.enqueue(new CallBack<Void>(){ 
     @Override 
     public void onResponse(Call<Void> call, Response<Void> response) { 
      // ?? how to delete target from realm ?? 
     } 

     @Override 
     public void onFailure(Call<Void> call, Throwable t) { 
      // do nothing 
     } 
    }); 
} 
+0

は、 "私はdeleteFromRealmを(使用しようとしました)が、失敗します。" 「失敗」を定義する。 – njzk2

+0

レルムオブジェクトはコピーされないので、同じオブジェクトにアクセスしています。 statusと呼ばれる列のように正常に送信されたオブジェクトを同期して更新しようとしましたか。後で終了したら削除しますか? – Eenvincible

答えて

0

それは通常のArrayListの項目を除去することと同じです。これは許可されず、ConcurrentModificationExceptionをスローします。

また、サーバーにアイテムを1つずつ送信するのではなく、アレイに収集して1つの要求ですべてのデータを渡すことをお勧めします。あなたは

RealmResults<Model> results = realm.where(Model.class).findAll(); 
ArrayList<Model> list = new ArrayList(results); 

を使用し、このようなデータを送信しようとすることができるのArrayListにすべてのデータを収集するために

Call<Void> task = restInterface.post(gson.toJson(list)); 
    task.enqueue(new CallBack<Void>(){ 
     @Override 
     public void onResponse(Call<Void> call, Response<Void> response) { 
      // As a result all data will be uploaded in the same one batch and you can safely clear the db 
      results.deleteAllFromRealm(); 
     } 

     @Override 
     public void onFailure(Call<Void> call, Throwable t) { 
      // do nothing 
     } 
    }); 
+0

ループがまだアクティブなときにコールバックが呼び出された場合にのみ、 "ConcurrentModificationException"が返されます – njzk2

+0

'gson.toJson(list)' OPのポストでは、エンドポイントも個々のアイテムではなくリストを受け入れることを示唆していません – njzk2

+0

@ njzk2これは私の提案です(多くのリクエストの代わりに1つのリクエストを使用する) –

関連する問題