2016-11-23 4 views
0

Ich bekomme eine Menge IllegalStateExceptions, die schwer zu debuggen sind. Sie treten auf, wenn ich ein Realm-Objekt aus einem RealmAdapter lösche. Für den RealmAdapter verwende ich die 'io.realm: android-adapter: 1.3.0' Version.Realm-Objekt aus RealmRecyclerViewAdapter löschen

Dies ist, wie ich mein Objekt auf lange drücken in meinem Adapter löschen:

//Delete message object 
    new MaterialDialog.Builder(holder.cardView.getContext()).title("Delete") 
      .content("Delete message?") 
      .positiveText("YES") 
      .negativeText("Cancel") 
      .onPositive(new MaterialDialog.SingleButtonCallback() { 
       @Override 
       public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { 

        //Call delete 
        ApiManager.ApiManagerService apiManagerService = ApiManager.createService(ApiManager.ApiManagerService.class); 
        apiManagerService.deleteMessage(message.getId()).enqueue(new Callback<Void>() { 
         @Override 
         public void onResponse(Call<Void> call, Response<Void> response) { 
          Logger.d("delete message onResponse callback"); 

          //Delete from realm 
          Realm realm = Realm.getDefaultInstance(); 
          realm.beginTransaction(); 
          try { 
           message.deleteFromRealm(); 
          } catch(Exception e) { 
           e.printStackTrace(); 
          } 
          realm.commitTransaction(); 

          //Notify adapter 
          notifyDataSetChanged(); 
         } 

         @Override 
         public void onFailure(Call<Void> call, Throwable t) { 
          Logger.d("delete message onFailure callback"); 
         } 
        }); 
       } 
      }) 
      .show(); 

    return false; 
} 

Ist der richtige Weg, um ein Objekt von innen einem Adapter zu handhaben zu löschen?

Antwort

2

Diese

    @Override 
        public void onResponse(Call<Void> call, Response<Void> response) { 
         Logger.d("delete message onResponse callback"); 

         //Delete from realm 
         Realm realm = Realm.getDefaultInstance(); 
         realm.beginTransaction(); 
         try { 
          message.deleteFromRealm(); 
         } catch(Exception e) { 
          e.printStackTrace(); 
         } 
         realm.commitTransaction(); 

         //Notify adapter 
         notifyDataSetChanged(); 
        } 

sollte

    @Override 
        public void onResponse(Call<Void> call, Response<Void> response) { 
         Logger.d("delete message onResponse callback"); 

         //Delete from realm 
         final long messageId = message.getId(); 
         Realm realm = Realm.getDefaultInstance(); // TODO: use Realm bound to lifecycle 
         realm.executeTransactionAsync(new Realm.Transaction() { 
          @Override 
          public void execute(Realm realm) { 
           realm.where(Message.class).equalTo("messageId", messageId).findAll().deleteAllFromRealm(); 
          } 
         }); 
         realm.close(); 

         //Notify adapter 
         ////notifyDataSetChanged(); 
        }