【问题标题】:How to retrieve data from Firebase without EventListener?如何在没有 EventListener 的情况下从 Firebase 检索数据?
【发布时间】:2018-03-03 11:25:57
【问题描述】:

我在我的 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


【解决方案1】:

这可能是因为您正在使用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 数据库,没有其他办法。

【讨论】:

  • 谢谢!我已经意识到问题是 RecyclerView 没有在第一时间得到通知。反正SingleValue不直接取数据,它需要一个事件作为AddValue,但只需要一次。
【解决方案2】:

要解决这个问题,请使用addListenerForSingleValueEvent 而不是addValueEventListenerValueEventListener 会在您的数据库每次发生变化时触发。

更改此设置并尝试在您的 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。

来自official documentation请参阅:

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

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

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

【讨论】:

  • 谢谢!我已经意识到问题是 RecyclerView 没有在第一时间得到通知。正如你所说,我尝试使用 Log,我注意到它获取了所有信息,但 RecyclerView 不检索。反正SingleValue不直接取数据,它需要一个事件作为AddValue,但只需要一次。
  • 如果我的回答有用,至少点击它左边的upvote按钮。这样其他人就知道你已经(充分地)得到了帮助。谢谢!
【解决方案3】:

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

adapter.startListening();

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

【讨论】:

  • 我确信它以这种方式工作。我正在重用一个普通的回收器视图,它显示了来自 SQLite 数据库的信息。
【解决方案4】:

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

更新

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

【讨论】:

    猜你喜欢
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多