从Firebase数据库获取价值
问题描述:
我需要从我的Firebase数据库中的节点密码中获取字符串值以与用户输入进行比较,但不幸的是我无法获取该值。这是下面图片中我的Firebase数据库的链接。从Firebase数据库获取价值
这是我下面的代码:
final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("pin_code");
mDatabase.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
@Override
public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
String rface = (String) dataSnapshot.child("pincode").getValue();
if (rface.equals(userPassword) && !rface.equals("")){
Intent intent = new Intent(PinActivity.this, ProfileActivity.class);
startActivity(intent);
}
else {
if (rface.equals("") || rface.equals(null)){
// Creating new user node, which returns the unique key value
// new user node would be /users/$userid/
String userId = mDatabase.push().getKey();
// creating user object
Pin pin = new Pin(authUserId, userPassword);
mDatabase.child(userId).setValue(pin);
Intent intent = new Intent(PinActivity.this, ProfileActivity.class);
startActivity(intent);
}
else {
Toast.makeText(PinActivity.this,"Invalid PIN code", Toast.LENGTH_SHORT).show();
return;
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
这是JSON代码
{
"pin_code" : {
"id" : "TQYTo1NHNnhPJnOxhe1Vok3U6ic2",
"pincode" : "12345"
}
}
答
这FirebaseDatabase.getInstance().getReference("pin_code")
并不是指你要找的节点。最有可能你知道的id
属性,在这种情况下,你可以得到与该节点:
DatabaseReference collection = FirebaseDatabase.getInstance().getReference("p...");
Query query = collection.orderByChild("id").equalTo("TQT...ic2");
query.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
@Override
public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
for (DataSnapshot child: dataSnapshot.getChildren()) {
String rface = (String) child.child("pincode").getValue();
if (rface.equals(userPassword) && !rface.equals("")){
我所做的更改:
- 在第一行,我们得到的集合:在节点您想要运行查询。您在屏幕截图中删除了该节点的名称,但这是您标记的第二行。
- 在第二行中,我们创建一个查询集合下每个子节点的
id
属性。 - 在
onDataChange
中,我们添加了一个循环。这是必需的,因为对Firebase数据库的查询可能会有多个结果。因此dataSnapshot
包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。我们通过dataSnapshot.getChildren()
来处理这些多个结果。
如果能永远只能与同id
一个节点,你应该考虑改变你的数据结构使用id
为节点的关键。因此:
pin_codes
uid1: "pincode1"
uid2: "pincode2"
因为您不需要再为用户查询,您的代码就变得简单得多了。你可以直接从路径阅读:
DatabaseReference user = FirebaseDatabase.getInstance().getReference("pin_codes").child("TQT...ic2");
user.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
@Override
public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
String rface = (String) dataSnapshot.getValue();
if (rface.equals(userPassword) && !rface.equals("")){
答
尝试改变这一点:
String rface = (String) dataSnapshot.child("pincode").getValue();
要这样:
String rface = (String) dataSnapshot.child("pincode").getValue(String.class);
+0
当我补充说,我有这个错误显示java.lang.NullPointerException:尝试调用虚拟方法“布尔java.lang.String.equals(java.lang.Object中) '在这一行的空对象引用if(rface.equals(userPassword)&&!rface.equals(“”)) –
我编辑了我的代码与您的建议,但现在它不返回给我。 –
我在我的最初片段中发生了错误。我只是解决了这个问题,所以看看能否解决你现在遇到的问题。 –
我用第二种方法,它不返回任何值 –