Android 如何阻止Firebase数据库始终返回0?

Android 如何阻止Firebase数据库始终返回0?,android,firebase,firebase-realtime-database,firebase-authentication,Android,Firebase,Firebase Realtime Database,Firebase Authentication,出于某种原因,当从fire base实时数据库接收数据时,无论我登录到哪个帐户或数据库中的任何内容,即使数据库中存储的值不是零,数据库也会始终将“点”返回为0。当我检查时,Uid是绝对正确的。我不明白为什么,我已经尝试解决这个问题一段时间了。代码在不同的活动中工作,没有任何变化 要解决此问题,请使用以下代码: String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference rootRef

出于某种原因,当从fire base实时数据库接收数据时,无论我登录到哪个帐户或数据库中的任何内容,即使数据库中存储的值不是零,数据库也会始终将“点”返回为0。当我检查时,Uid是绝对正确的。我不明白为什么,我已经尝试解决这个问题一段时间了。代码在不同的活动中工作,没有任何变化


要解决此问题,请使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        long points = dataSnapshot.child("points").getValue(Long.class);
        Log.d("TAG", points + "");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
别忘了这样设置您的安全规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

因此,只有经过身份验证的用户才能向数据库读取或写入数据。

我找到的解决方案是将文本视图中显示“点”的代码部分移动到“onDataChange”子例程中

   DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("Users").child(uid);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Integer value = dataSnapshot.child("points").getValue(Integer.class);
            if (value != null) {
                points = value;
            } else {
                points = 0;
            }
            value = dataSnapshot.child("totalpoints").getValue(Integer.class);
            if (value != null) {
                totalpoints = value;
            } else {
                totalpoints = 0;
            }

            txtpoints.setText("Points: "+ points);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d("my tag","data Snapshot Cancelled");
        }
    };
    uidRef.addListenerForSingleValueEvent(valueEventListener);

你能编辑一下你的问题来说明什么是零,以及你是如何知道它是零的吗?不要害怕在代码中放入大量日志语句。“Points”始终返回为0,即使它不在数据库中。我已将数据包含在数据库中。请编辑您的问题以显示您如何知道该值为0。在代码中,您在哪里检查它的值?如果在回调中赋值后立即记录它的值会怎么样?您是否得到了totalpoints的任何信息?totalpoints也返回为0谢谢您的回复。我已经做了更改,但它似乎仍然返回0。这就是我的答案,对吗?有了这个值,你可以用它做任何你想做的事情,显然是在
onDataChange()
中,因为这个方法有一个,对吗?
   DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("Users").child(uid);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Integer value = dataSnapshot.child("points").getValue(Integer.class);
            if (value != null) {
                points = value;
            } else {
                points = 0;
            }
            value = dataSnapshot.child("totalpoints").getValue(Integer.class);
            if (value != null) {
                totalpoints = value;
            } else {
                totalpoints = 0;
            }

            txtpoints.setText("Points: "+ points);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d("my tag","data Snapshot Cancelled");
        }
    };
    uidRef.addListenerForSingleValueEvent(valueEventListener);