我在我的android项目中使用Firebase-UI和电子邮件/密码提供程序。数据库的结构是:
profiles
user-id
age
height
user-id
在注册时,我想在配置文件中输入具有默认值的新节点。用户可以稍后编辑和保存值。对于现有用户,我只想读取值并在UI中显示它们。我已经尝试使用ChildEventListener和dataSnapshot.hasChild(uid)来检测用户是否已经存在但是它不起作用。这是AuthStateListener:
mAuthStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = mFirebaseAuth.getCurrentUser();
if(user != null)
{
onSignedInInitialize(user);
}
else
{
onSignedOutCleanup();
startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().setProviders(providers).build(), SIGN_IN);
}
}
};
这就是我的尝试:
private void onSignedInInitialize(final FirebaseUser user) {
userRef = mProfilesDBReference.child(user.getUid());
if(mValueEventListener == null)
{
mValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue() == null)
{
UserProfile profile = new UserProfile("username", null, 100, 100);
userRef.setValue(profile);
UpdateUI(profile);
}
else
{
UserProfile profile = dataSnapshot.getValue(UserProfile.class);
UpdateUI(profile);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
}
userRef.addValueEventListener(mValueEventListener);
}
答案 0 :(得分:1)
让我们说用户ID存储在uid
;
你可以像这样获取身高和年龄。
DatabasReference userRef = database.getReference("profiles").child(uid);
userRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue() == null){
//User data doesnt exist
}
else
{
HashMap<String,String> userMap =
(HashMap<String,String>)dataSnapshot.getValue();
String age = userMap.get("age");
String height = userMap.get("height");
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
请注意,我假设您已将它们存储为字符串,firebase通常将int转换为long。因此,如果您使用了int,请将hashmap的值类型转换为Long
。
更好的方法是创建一个POJO类。