所以我有一个简单的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();
}
});
}
关于我可能出错的地方的任何想法? 提前谢谢。
答案 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的待办事项列表应用。希望我能够提供帮助,如果您有任何其他问题或者某些事情不清楚,请随时发表评论。