繁体   English   中英

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

[英]How to retrieve data from Firebase without EventListener?

我在我的 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 的工作原理完全相同,不同之处在于它只执行一次,只监听第一个事件。

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

发生这种情况可能是因为您正在使用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) {}
});

但是,您必须使用事件监听器来读取您的 firebase 数据库,没有其他方法。

要解决此问题,请使用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()的 getter。

官方文档pelase 看到:

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

addValueEventListener(ValueEventListener listener) - 为该位置的数据变化添加一个监听器。

还有一件事,您根本无法在不使用侦听器的情况下检索数据。 Firebase 中的一切都与听众有关。

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

适配器.startListening();

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

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

更新

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM