仅一次从实时数据库检索数据

时间:2018-08-13 11:11:15

标签: android firebase firebase-realtime-database

我希望我的应用允许用户备份他在Realtime Database上的数据并还原它。我已经实现了备份功能,但是在尝试实现恢复功能时遇到了麻烦。因为ChildEventListener仅使您能够实时检索数据,所以这是一个问题,因为我需要知道备份何时完成下载。我怎么只能检索一次数据?

3 个答案:

答案 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
                }
            });