1

所以我有一个简单的 firebase android 应用程序,我的目标是满足许多不同的用户。用户注册,并在创建时,他们的 Uid 存储在用户表中,以及其 Uid 下的 UserInformation 条目,其值为“UserType”和“IsCurrentlyTracking”。用户登录后,将被带到个人资料活动,他们可以在其中按下按钮继续通过应用程序。这是我的表结构:

按下继续后,将检索其 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 下),用户信息也没有从 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;
}

关于我可能出错的地方有什么想法吗?先感谢您。

4

1 回答 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",
    }
  }
}

如需更完整的示例,请查看我制作的待办事项列表应用程序,该应用程序在此处使用相同的数据库组织模式。希望我能够提供帮助,如果您有任何其他问题或不清楚的地方,请随时发表评论。

于 2016-11-17T14:16:35.680 回答