首页 文章

Android - Firebase;登录时,检索数据(分层)并根据该数据重定向该用户

提问于
浏览
1

所以我有一个简单的firebase android应用程序,我可以使用它来运行' . 用户登录后,会进入“ Profiles ”活动,按下按钮可继续浏览应用程序 . 这是我的表结构:

在按下继续时,将检索其UserInformation数据 . 根据该数据,它们被重定向到另一个活动 . 应用程序停止/崩溃,而不是执行上述操作 .

以下是重定向用户的代码/方法:

public void userRedirect(){

    firebaseAuth = FirebaseAuth.getInstance();
    user = firebaseAuth.getCurrentUser();

    final FirebaseDatabase database = FirebaseDatabase.getInstance();

    Query q = database.getReference("Users/" + user.getUid() + "/UserInformation");

    q.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
                UserInformation uI = dataSnapshot.getValue(UserInformation.class);
                int userType = uI.getUserType();
                boolean ICT = uI.getTrackingStatus();

                if ((userType == 1) && (!ICT)) {

                    finish();
                    startActivity(new Intent(ProfileActivity.this, AllocationActivity.class));
                }
            }
        }

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

我以前能够检索数据,虽然信息没有存储在'用户'表中(仅在用户的UiD下),UserInformation也没有从UiD下载 .

对于一些额外的上下文,这是我的用户类:

public int UserType;
public boolean IsCurrentlyTracking;

public UserInformation(int userType, boolean IsCurrentlyTracking){
    this.UserType = userType;
    this.IsCurrentlyTracking = IsCurrentlyTracking;
}

public int getUserType()
{
    return UserType;
}

public boolean getTrackingStatus()
{
    return IsCurrentlyTracking;
}

关于我可能出错的任何想法?先感谢您 .

1 回答

  • 1

    我建议您使用FirebaseUI进行身份验证并获取对uid的引用 . 我还建议您不要使用“”来连接Firebase路径 . 试试这个:

    private DatabaseReference databaseReference;
    
    ...
    
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child(FirebaseAuth
                    .getInstance().getCurrentUser().getUid()).getRef();
    

    并添加一个这样的监听器:

    listener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    // handle UserInformation here
                }
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        };
    
    databaseReference.addValueEventListener(listener);
    

    我更喜欢将它分离而不是在方法中覆盖它的原因是我可以在onDestroy中执行以下操作:

    @Override
        protected void onDestroy() {
            super.onDestroy();
            databaseReference.removeEventListener(listener);
        }
    

    保持DatabaseReference和listener作为成员变量使这更容易 .

    此外,请务必设置适当的Firebase规则,以加强用户对其数据的访问权限:

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

    有关更完整的示例,请查看我制作的todo列表应用程序,该应用程序使用相同的数据库组织模式here . 希望我能够提供帮助,如果您有任何其他问题或者某些事情不清楚,请随时发表评论 .

相关问题