【问题标题】:Firebase permission denied while reading data读取数据时 Firebase 权限被拒绝
【发布时间】:2018-01-23 02:44:34
【问题描述】:

我正在尝试从 Firebase 实时数据库中读取一些数据,但每次尝试时我都会收到数据库错误并显示权限被拒绝的消息。这是我用来读取数据的代码。

    mAuth = FirebaseAuth.getInstance();
    FirebaseUser currentUser = mAuth.getCurrentUser();
    userId = currentUser.getUid();

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                User user = new User();
                user.setFullName(ds.child("users").child(userId).getValue(User.class).getFullName());
                user.setEmail(ds.child("users").child(userId).getValue(User.class).getEmail());
                Log.i("info", " User Full name" + user.getFullName());
                userFullName.setText(user.getFullName());
                userEmail.setText(user.getEmail());
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.i("Info", "" + databaseError.getMessage());
        }

    });

这些也是我的数据库规则

  {
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

这也是数据库中的数据。

我想做什么? - 我做了两件事,首先我将数据库规则设置为公开,但这对我不起作用,我做的第二件事是使用addValueEventListener 而不是使用addChildEventListener,但这也没有用。

所以如果有人知道我在哪里犯了错误,请与我分享。

提前致谢。

【问题讨论】:

  • 那么,您是说 onCancelled() 回调正在被调用?当您“将数据库规则设置为公开”时,您到底做了什么?
  • 你说“将数据库规则设置为公开”是什么意思?
  • 我怀疑这取决于数据库规则,因为我说过我将它们设置为 { "rules": { ".read": true, ".write": true } } 但这对我没有帮助。

标签: android firebase firebase-realtime-database


【解决方案1】:

你的数据库规则是正确的,问题出在数据库读取代码上。您可以直接将DatabaseReference设置为/users/<userId>,然后将DataSnapshot的值直接转换为User类。

代码如下:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("users").child(userId);
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User user = dataSnapshot.getValue(User.class);

        userFullName.setText(user.getFullName());
        userEmail.setText(user.getEmail());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

希望这会有所帮助:)

【讨论】:

  • 我刚刚尝试了你的建议,但两种方法都没有触发我仍然无法理解。
  • 我快速记录了 databaseReference 并打印了用户的 URL,这意味着它找到了正确的用户,但遗憾的是没有检索到数据。
  • 我发现我的错误出在哪里,感谢它现在工作的响应。我投了赞成票并接受了你的回答。
  • 您究竟是如何解决这个问题的。请分享。我从 2 天开始就面临同样的问题。
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 2016-08-27
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多