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

Java 如何在没有EventListener的情况下从Firebase检索数据?,java,android,database,firebase,Java,Android,Database,Firebase,我在Android应用程序上使用Firebase,我知道如何使用EventListener从数据库中获取数据。嗯,到目前为止 我的问题是:我有一个视图,它显示数据中的信息,但只有当我修改数据库时才显示。如果我关闭应用程序并再次打开,它不会显示任何内容。然后,我修改了一些内容,并将所有元素显示在容器中 是否有任何方法可以加载此数据—不等待事件,而是手动获取 先谢谢你 更新1(这是我的代码,它可以完美地工作): 我希望不使用EventListener获取数据 解决方案:我修复了在创建Recycler

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

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

是否有任何方法可以加载此数据—不等待事件,而是手动获取

先谢谢你

更新1(这是我的代码,它可以完美地工作):

我希望不使用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) {}
});

但是,您必须使用eventlisteners来读取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中的所有内容都与侦听器有关。

您可能正在侦听子事件,您应该知道,它会在单个快照中返回完整的数据列表,您可以在其中循环,而子事件则只有在添加/更新子事件时才会触发

更新


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

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

adapter.startListening()

您可以在这里获得完整的文档。

请添加您的代码。我认为不需要添加任何代码。我没有错误。这只是一个问题。但好的,我将分享一部分代码。谢谢!我意识到问题在于RecyclerView没有第一时间得到通知。无论如何,SingleValue不会直接检索数据,它需要一个事件作为AddValue,但只需要一次。谢谢!我意识到问题在于RecyclerView没有第一时间得到通知。正如您所说,我尝试使用Log,我注意到它获取了所有信息,但RecyclerView无法检索。无论如何,SingleValue不会直接检索数据,它需要一个事件作为AddValue,但只需要一次。如果我的答案有用,至少单击它左侧的upvote按钮。这样别人就知道你得到了(足够的)帮助。谢谢我确信它是这样工作的。我重用了一个普通的recycler视图,该视图显示了来自SQLite数据库的信息。
Log.d("TAG", lc.getLyricCardName());