我在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的工作方式完全相同,只有一次,只听到第一个事件。
我希望这也可以帮助别人。
答案 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
,它只获取一次数据,不要再监听任何其他事件。