我有以下的Firebase数据库:
我试图只检索用户下单个孩子的一个属性。这是我的数据库的屏幕截图:
如果你检查屏幕截图,我只想检索电子邮件(假设我没有其他方式获取它)。但是,在代码中,我不会知道包含我想要的电子邮件的User的孩子。这是我目前正在做的但效率很低(这段代码检查我当前的用户是否存在,如果没有,它会将他/她的数据添加到数据库中):
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("User");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> children = dataSnapshot.getChildren();
for (DataSnapshot child:children) {
User user1 = child.getValue(User.class);
Log.d("kharas email",user1.getEmail()+"");
if(!user1.getEmail().equals(firebaseAuth.getCurrentUser().getEmail())){
GraphRequest.newMeRequest(token, new GraphRequest.GraphJSONObjectCallback() {
String birthday = "Not Available";
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
User userInfo = new User();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("User");
birthday = object.has("email")+"";
userInfo.setBirthday(birthday);
userInfo.setEmail(firebaseAuth.getCurrentUser().getEmail());
ref.push().setValue(userInfo);
}
}).executeAsync();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我尝试将User下的子项设置为电子邮件,但firebase不允许我在键中使用一些特殊字符。任何使代码更有效的建议都将受到赞赏。或者任何可以使查询更容易的关键建议都会很棒。
提前致谢
答案 0 :(得分:1)
您可以添加从火灾基地收到的E
,而不是放置随机值或自动生成的密钥
([^=\"]*[^=\s])
这将更容易访问并且效率更高,因为无论何时您将登录,您将拥有此user's id
并且对应于firebaseAuth.getCurrentUser().getUid()
您可以收到电子邮件而不是检查所有值数据库
答案 1 :(得分:0)
如果您不知道随机密钥,检索电子邮件的唯一方法是:
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("User");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){ for (DataSnapshot child:children) {
String email=datas.child("email").getValue().toString();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
或者您可以使用firebase身份验证并在Users
而不是push()
下添加用户ID,然后检索用户ID:
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userid=user.getUid();
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("User");
ref.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String email=dataSnapshot.child("email").getValue().toString();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
这样你就不必循环了。