所以我有一个简单的 firebase android 应用程序,我的目标是迎合许多不同的用户。 用户注册并在创建时,他们的 Uid 存储在用户表中,以及 Uid 下的 UserInformation 条目,值为“UserType”和“IsCurrentlyTracking”。 用户登录后,将转到配置文件 Activity ,他们可以在其中按下按钮继续使用应用程序。 这是我的表结构:
在按下继续时,他们的 UserInformation 数据被检索。基于该数据,他们被重定向到另一个 Activity 。 应用程序没有执行上述操作,而是停止/崩溃。
这是重定向用户的代码/方法:
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;
}
关于我可能哪里出错的任何想法? 提前谢谢你。
最佳答案
我建议您使用 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 .希望我能提供帮助,如果您有任何其他问题或不清楚的地方,请随时发表评论。
关于安卓——火力地堡;登录时,检索数据(分层)并根据该数据重定向该用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40656957/