2016-12-04 192 views
0

我試圖從數據庫中刪除一些項目時聽Realm的通知。所以我試過這個代碼:領域刪除監聽器

realm.where(Book.class).findAllAsync().addChangeListener(new RealmChangeListener<RealmResults<Book>>() { 
     @Override 
     public void onChange(RealmResults<Book> element) { 
      // nothing changed here 
      Log.d(TAG, "onChange: size = "+element.size()); 
     } 
    }); 

    realm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      Book book = realm.where(Book.class).equalTo("id", 45).findFirst(); 
      book.deleteFromRealm(); 
     } 
    }); 

但是聽衆從來沒有觸發。我需要確定哪些項目已被用戶刪除,以便我可以將它們從RecyclerView中刪除。你有什麼想法如何解決這個問題?

回答

0

似乎沒有對境界指定任何刪除偵聽器。但是,從數據庫中刪除項目時,將會觸發領域通知。通過重新檢查Realm數據庫中哪些列表項不再可用,並從列表中刪除它們(RecyclerViewListView),我們可以從中獲益。這裏的例子:

@Override 
    public void onChange(RealmResults<Article> articles){ 
     Set<Integer> ids = new HashSet<>(articles.size()), toRemove = new HashSet<>(); 
     List<ModelArticle> models = new ArrayList<>(articles.size()); 
     for (Article article : articles){ 
      ModelArticle model = adapter.getValueById(article.id); 
      if (model == null) { 
       // insert new data into list 
       model = new ModelArticle(article); 
       models.add(model); 
      }else{ 
       // if data already exists, just update it 
       model.updateArticle(article); 
       adapter.notifyItemChanged(adapter.getPositionById(model.id)); 
      } 
      ids.add(model.id); 
     } 
     // find which items should be removed from list 
     for (ModelArticle model : adapter.getValues()) 
      if (!ids.contains(model.id)) 
       toRemove.add(model.id); 

     // remove all items that are no longer available 
     adapter.removeAllById(toRemove); 
     // add all items that just added into database 
     adapter.addAll(models); 
    } 

順便說一句,我使用的境界2.2.1

0

您需要保留的結果作爲一個字段引用

private RealmResults<Book> books; 

public void someMethod() { 
    books = realm.where(Book.class).findAllAsync(); 
    books.addChangeListener(new RealmChangeListener<RealmResults<Book>>() { 
     @Override 
     public void onChange(RealmResults<Book> element) { 
      // nothing changed here 
      Log.d(TAG, "onChange: size = "+element.size()); 
     } 
    }); 

    realm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      Book book = realm.where(Book.class).equalTo("id", 45).findFirst(); 
      book.deleteFromRealm(); 
     } 
    }); 
} 
+0

但是,我也需要傾聽不同活動的變化。使用這種技術只會影響當前的活動。我需要決定哪些項目被用戶刪除,以便我可以從'RecyclerView'中刪除它們。領域是否支持刪除通知? –

+0

但是,你一次只能在前面進行一項活動,不是嗎?您也可以在其他活動中執行相同的操作(字段引用和查詢)。 – EpicPandaForce