【问题标题】:Android - Firebase Level of AccessAndroid - Firebase 访问级别
【发布时间】:2019-04-07 17:29:46
【问题描述】:

我是 Android 开发的新手,仍在学习基础知识并尝试获得不同的访问权限我在我的数据库中有这个结构我正在获取 status 的值并使用 at 作为用户类型

我得到了这个错误

java.lang.String java.lang.Object.toString()' on a null object reference
at com.example.gab.quadrantms.LoginActivity$1$1$1.onDataChange(LoginActivity.java:116)

登录

private DatabaseReference mUserType;
mUserType = FirebaseDatabase.getInstance().getReference().child("Users").child("status");

mUserType.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    // THIS IS WHERE THE ERROR IS POINTING
    String status = dataSnapshot.child("status").getValue().toString();
     if(status.equals("Project Manager"))
     {
        Intent intent = new Intent(LoginActivity.this, Home.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
     }
     else
     {
        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
     }
  }

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebase-authentication


    【解决方案1】:
    FirebaseReference ref=FirebaseDatabase.getInstance().getReference().child("Users").child(current_user_id);
    
    ref.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
    
          String status = dataSnapshot.child("status").getValue().toString();
          if(status.equals("Project Manager"))
          {
            Intent intent = new Intent(LoginActivity.this, Home.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
          }
          else
          {
            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
          }
      }
    

    首先您需要创建对节点Users 的引用,然后因为您需要访问子节点status,并且您在节点Users 下有一个随机ID。您必须在 dataSnapshot 的直接子节点内循环(在本例中为节点 Users),您将能够获得 status 的值。

    【讨论】:

    • 我通常更喜欢ds.child("status").getValue(String.class),因为它可以防止无意的类型转换,并且当数据库中不存在status 属性时不会导致NPE。
    • 我可以登录,但它忽略了 If 并且只执行 else 语句
    • @GabrielApostol 尝试使用addListenerForSingleValueEvent 而不是addValueEventListener
    • @GabrielApostol 你在User 节点下有很多ids 属性,这就是为什么它在循环时获得另一个状态的原因。你需要获取id的值
    • @GabrielApostol 然后在此处添加 FirebaseReference ref=FirebaseDatabase.getInstance().getReference().child("Users").child(current_user_id); 并删除 for 循环 String status = dataSnapshot.child("status").getValue().toString();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2013-05-07
    • 2019-10-05
    相关资源
    最近更新 更多