我希望我的应用允许用户备份他在Realtime Database上的数据并还原它。我已经实现了备份功能,但是在尝试实现恢复功能时遇到了麻烦。因为ChildEventListener
仅使您能够实时检索数据,所以这是一个问题,因为我需要知道备份何时完成下载。我怎么只能检索一次数据?
答案 0 :(得分:1)
要只检索一次数据,您需要使用以下内容:
public void addListenerForSingleValueEvent (ValueEventListener listener)
为此位置的数据中的单个更改添加一个侦听器。该侦听器将被触发一次,并带有该位置的数据值。
答案 1 :(得分:1)
对于数据库引用对象,与添加事件侦听器的方式相同,也可以使用removeEventListener
将其删除。
而不是像这样创建一个匿名对象
checkBuy.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
checkPurchase(snapshot);
addListView();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
您可以创建 ValueEventListener
的命名对象,并在 removeEventListener
方法的末尾使用 onDataChange
将其从数据库引用对象中删除
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
checkPurchase(snapshot);
addListView();
checkBuy.removeEventListener(valueEventListener);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
checkBuy.addValueEventListener(valueEventListener);
onDataChange
方法中的代码只执行一次,因为 ValueEventListener
对象在方法的最后一行执行后立即被删除。
答案 2 :(得分:0)
您需要改用addListenerForSingleValueEvent() 例如:
FirebaseDatabase.getInstance()
.getReference()
.child("Your Node")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// Do whatever you need with your data (retrieved only once)
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
// Handle Database Error
}
});