2016-12-04 9 views
0

データベースからいくつかのアイテムを削除したときに、レルムの通知を聞こうとしています。だから私はこのコードを試した:レルム削除リスナー

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から削除することができます。これを修正する方法はありますか?あなたは、フィールドの参照として結果

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

を保持する必要が

0

は、レルムに指定された削除リスナー決してありませんようです。ただし、データベースから項目を削除すると、領域通知がトリガーされます。レルム・データベースでは使用できなくなったリスト項目を再確認し、リスト(RecyclerViewまたはListView)から削除することで、ここで利点を得ることができます。ここでは例です:

@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

を使用しかし、私はまた、別の活動の変化を聞く必要があります。この手法を使用すると、現在のアクティビティにのみ影響します。どのアイテムがユーザーによって削除されたのかを判断する必要があるので、それらを「RecyclerView」から削除することができます。レルムは削除通知をサポートしていますか? –

+0

しかし、一度に1つのアクティビティだけを前面に表示することはできますか?他のアクティビティでも同じこと(フィールド参照とクエリ)を実行できます。 – EpicPandaForce

関連する問題