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

时间:2016-11-17 14:05:09

标签: android firebase layered

所以我有一个简单的firebase android应用程序,我的目标是为许多不同的用户提供服务。 用户注册,并且在创建时,他们的Uid存储在用户表中,以及其Uid下的UserInformation条目,其值为' UserType'和' IsCurrentlyTracking'。 用户登录后,会进入“个人资料”活动,按下按钮可继续浏览应用程序。 这是我的表结构:

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

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

enum

我以前能够检索数据,尽管这些信息并未存储在“用户”中。表(仅在用户的UiD下),UserInformation也不是来自UiD。

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

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();
        }
    });
}

关于我可能出错的地方的任何想法? 提前谢谢。

1 个答案:

答案 0 :(得分: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",
    }
  }
}

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