Firebase数据库检索数据问题

时间:2017-11-04 08:46:56

标签: android firebase firebase-realtime-database

我在我的应用程序中放了一个按钮。当我按下按钮+1值保存到我的数据库。因此,我想检查按钮count =5显示警报时的方法。当我单击按钮时,它会检查。当我的按钮count =5警报显示3-4次时。但我想展示一次:(

以下是代码:

private void ButtonChecker(){
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference ezzeearnRef = rootRef.child(User1);
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Long BRef1 = dataSnapshot.child("BRef").getValue(Long.class);
                assert BRef1 != null;
                int x = BRef1.intValue( );
                ref = x;
                if (x ==5){
                    showAlert("Don't CLick Button ");
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };
        ezzeearnRef.addValueEventListener(eventListener);
    }

2 个答案:

答案 0 :(得分:1)

每次用户按下按钮时,您都会注册一个新的侦听器。如果初始值为3,则用户必须按两次按钮才能将其转到5。这意味着您的代码会注册两个侦听器,从而显示两个警报。

两种解决方案:

  • 只注册一次监听器。
  • 注册只获取当前值的侦听器。

注册只获取当前值的侦听器

这是最简单的改变:我们将注册一个监听器:

  1. 读取当前值
  2. 自动取消注册
  3. 唯一的变化是你如何注册听众:

    ezzeearnRef.addListenerForSingleValueEvent(eventListener);
    

    但是这仍然会为每次点击注册/取消注册一个监听器,这可能有点浪费。另外:如果你曾经让你的应用程序成为多用户,那么就会忽略其他用户也可能会增加计数器的事实。

    只注册一次监听器

    尽可能在活动 - 生命周期方法中注册和注销您的侦听器。例如,在onStart中注册侦听器并在onStop中取消注册它们是很常见的:

    @Override
    protected void onStart() {
        super.onStart();
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference ezzeearnRef = rootRef.child(User1);
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
    
                Long BRef1 = dataSnapshot.child("BRef").getValue(Long.class);
                assert BRef1 != null;
                int x = BRef1.intValue( );
                ref = x;
                if (x ==5){
                    showAlert("Don't CLick Button ");
                }
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException(); // don't ignore errors
            }
        };
        ezzeearnRef.addValueEventListener(eventListener);
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        ezzeearnRef.removeEventListener(eventListener);
    }
    

    使用此代码,您的侦听器将在活动的生命周期中处于活动状态。在此期间,如果计数器(是或)变为5,则警报将显示一次。

答案 1 :(得分:0)

有时firebase会多次调用数据,因此您将获得超过一次的相同x值。修复此问题使用一个布尔变量来存储有关alert的值。

 boolean isAlertShown = false;

private void ButtonChecker(){
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference ezzeearnRef = rootRef.child(User1);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Long BRef1 = dataSnapshot.child("BRef").getValue(Long.class);
            assert BRef1 != null;
            int x = BRef1.intValue( );
            ref = x;
            if (x ==5 && !isAlertShown){
                 isAlertShown = true;
                showAlert("Don't CLick Button ");
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };
    ezzeearnRef.addValueEventListener(eventListener);
}