没有调用RealmChangeListener从数据库加载存储的项目

时间:2017-05-15 17:13:35

标签: android realm

我从realm数据库中获取一些数据,然后异步地在RealmResults上应用更多过滤器。我已针对每个查询注册了回调RealmChangeListener,但未触发回调。

以下是摘录:

RealmResults<Tweet> tweetsResults = RealmController
            .getInstance()
            .getRealm()
            .where(Tweet.class)
            .isNotNull("entities")
            .equalTo("entities.hashtags.text", inputString, Case.INSENSITIVE)
            .findAll();

我在tweetsResults中获取数据,然后我使用RealmResult(不是Realm对象)来获取过滤数据。

final RealmResults<Tweet> retweets = tweetsResults
            .where()
            .greaterThan("retweet_count", 0)
            .findAllSortedAsync("retweet_count", Sort.DESCENDING);

    retweets.addChangeListener(new RealmChangeListener<RealmResults<Tweet>>() {
        @Override
        public void onChange(RealmResults<Tweet> element) {
            Toaster.shortToast("Found " + retweets.size()); // => Not triggered
        }
    });

现在使用findAllSortedAsync我没有得到任何结果(但结果存在)并且没有触发回调。

当我将第二个查询更改为findAllSorted时,它会开始向我提供结果。

如果我的方法不对,请你指导我。

我使用 Realm v3.1.3 和Android Studio 2.3.2

1 个答案:

答案 0 :(得分:2)

你没有给出足够的背景,以便我可以告诉你在做什么。但是,如果retweets是方法中的局部变量,则@EpicPandaForce(当然)完全正确。

想一想。方法退出后,retweets超出范围。这意味着它所引用的RealmResults有资格进行垃圾收集。

一旦它消失了,你会期望通知者做什么?您将其注册为通知程序的对象早已不复存在!

事实上,因为retweets符合GC的条件,因此更改侦听器也是如此。他们都走了,你没有得到任何通知