如何在没有EventListener的情况下从Firebase检索数据?

时间:2018-03-03 11:25:57

标签: java android database firebase

我在Android应用上使用Firebase,我知道如何使用EventListener从数据库中获取数据。到目前为止。

我的问题是:我有一个ReciclerView,它显示来自数据的信息,但仅在我修改数据库时。如果我关闭应用并再次打开,它就不会显示任何内容。然后,我修改了一些东西,并在容器中显示了我的所有元素。

有没有办法加载这些数据而不是等待事件,而是手动获取?

提前谢谢。

UPDATE 1(这是我的代码完美无缺):

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            listaDeLyrics.clear();
            for (DataSnapshot lyricFromFB : dataSnapshot.getChildren()){
                    LyricCard lc = lyricFromFB.getValue(LyricCard.class);
                    listaDeLyrics.add(lc);
                }
            }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });

我希望不使用EventListener来获取数据。

解决方案:我在创建RecyclerView之前修复了从数据库中保存数据的问题。似乎没有显示任何内容,因为列表是空的(但我不明白为什么它没有对列表中的更改做出响应)

注意:addValueEvent也是第一次工作,甚至不修改任何东西。它在声明时获取信息,然后在事件发生时获取信息。 singleValueEvent的工作方式完全相同,只有一次,只听到第一个事件。

我希望这也可以帮助别人。

4 个答案:

答案 0 :(得分:3)

这种情况的发生可能是因为您正在使用addValueEventListener(),它将向引用添加侦听器并侦听该引用(路径)中的更改。

我建议使用addListenerForSingleValueEvent(),它只会查询该引用一次,然后从中删除它。因此,如果您每次打开活动时都这样做,那么每次都会有更新的值。

ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       //parse data to recycler view adapter and call notifyDatasetChange()
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
});

但是,您必须使用eventlisteners来读取您的firebase数据库,没有别的办法。

答案 1 :(得分:2)

要解决此问题,请使用addListenerForSingleValueEvent代替addValueEventListener。每次数据库发生变化时都会触发ValueEventListener

更改此设置并尝试使用onDataChange()方法打印结果。

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot lyricFromFB : dataSnapshot.getChildren()){
                LyricCard lc = lyricFromFB.getValue(LyricCard.class);
                Log.d("TAG", lc.getLyricCardName());
            }
        }
    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

我使用了以下代码行:

Log.d("TAG", lc.getLyricCardName());

假设你有一个名为getLyricCardName()的吸气剂。

official documentation pelase看:

  

addListenerForSingleValueEvent(ValueEventListener listener) - 为此位置的数据中的单个更改添加一个侦听器。

     

addValueEventListener(ValueEventListener listener) - 为此位置的数据更改添加侦听器。

还有一件事,在没有使用监听器的情况下,您无法检索数据。 Firebase中的所有内容都与听众有关。

答案 2 :(得分:1)

您可以使用firebaseUI直接从firebase数据库中获取数据到您的recyclerview。 EventListeners不是必需的,只需通过以下方式调用适配器即可获取数据:

adapter.startListening();

您可以在此处获取完整文档。 https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md

答案 3 :(得分:-1)

您可能正在监听子事件,您应该listen for value events,它会返回一个可以循环的单个快照中的整个数据列表,与子事件相比,子事件仅在子项发生时触发添加/更新。

<强>更新

如果你想在没有任何EventListener的情况下获取数据,那么只需使用addListenerForSingleValueEvent,它只获取一次数据,不要再监听任何其他事件。