Android 从Firebase数据库获取值
我需要从Firebase数据库中的节点密码中获取字符串值,以便与用户输入进行比较,但不幸的是,我无法获取该值。这是下图中我的firebase数据库的链接 以下是我的代码:Android 从Firebase数据库获取值,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我需要从Firebase数据库中的节点密码中获取字符串值,以便与用户输入进行比较,但不幸的是,我无法获取该值。这是下图中我的firebase数据库的链接 以下是我的代码: final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("pin_code"); mDatabase.addListenerForSingleValueEvent(new com.google.fire
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"
}
}
尝试更改此选项:
String rface = (String) dataSnapshot.child("pincode").getValue();
为此:
String rface = (String) dataSnapshot.child("pincode").getValue(String.class);
此
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("")){
使用以下命令:
Object some = dataSnapshot.getValue();
String value = some.toString();
当我添加以下错误时,java.lang.NullPointerException:如果(rface.equals(userPassword)&&&!rface.equals(“”),则尝试在此行的空对象引用上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”)我用你的建议编辑了我的代码,但现在它什么也不返回给我。我在最初的代码片段中犯了一个错误。我刚刚解决了这个问题,看看这是否解决了您现在的问题。我使用了第二种方法,它不返回任何值这是代码。DatabaseReference user=FirebaseDatabase.getInstance().getReference(“pin_代码”).child(“TQYTo1NHNnhPJnOxhe1Vok3U6ic2”);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(“”){//do something}}我收到以下错误java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”