2016-12-04 154 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