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

问题描述 投票:1回答:4

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

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

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

先感谢您。

更新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的工作原理完全相同,它只执行一次,只听到第一个事件。

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

java android database firebase
4个回答
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数据库,没有别的办法。


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()的吸气剂。

从qazxsw poi请看:

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

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

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


1
投票

您可以使用firebaseUI直接从firebase数据库中将数据提取到recyclelerview中。 EventListeners不是必需的,只需通过调用适配器来获取数据:

adapter.startListening();

您可以在此处获取完整的文档。 official documentation


-1
投票

您可能正在监听子事件,您应该https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md,它会返回一个可以循环的单个快照中的整个数据列表,与子事件相比,仅在添加/更新子项时触发。

UPDATE

如果你想获得没有任何EventListener的数据,那么只需使用listen for value events,它只获取一次数据并且不会监听任何其他事件。

© www.soinside.com 2019 - 2024. All rights reserved.