【问题标题】:Realm delete listener领域删除侦听器
【发布时间】:2017-01-17 21:25:49
【问题描述】:

当我从数据库中删除一些项目时,我正在尝试收听 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 中删除。你知道如何解决这个问题吗?

【问题讨论】:

    标签: android realm


    【解决方案1】:

    您需要将结果保留为字段参考

    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();
            }
        });
    }
    

    【讨论】:

    • 但是,我还需要听不同活动的变化。使用这种技术只会影响当前的活动。我需要确定用户删除了哪些项目,以便我可以将它们从RecyclerView 中删除。领域是否支持删除通知?
    • 但是你一次只能在前面有一个活动,不是吗?您也可以在其他活动中执行相同的操作(字段引用和查询)。
    【解决方案2】:

    似乎没有为 Realm 指定任何删除侦听器。但是,当您从数据库中删除项目时,将触发领域通知。我们可以利用这里的优势,重新检查哪些列表项在 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);
        }
    

    顺便说一下,我用的是Realm 2.2.1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      相关资源
      最近更新 更多