2017-08-02 180 views
0

我需要从我的Firebase数据库中的节点密码中获取字符串值以与用户输入进行比较,但不幸的是我无法获取该值。这是下面图片中我的Firebase数据库的链接。从Firebase数据库获取价值

Firebase Database screenshot

这是我下面的代码:

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" 
    } 
    } 

回答

0

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("")){ 

我所做的更改:

  1. 在第一行,我们得到的集合:在节点您想要运行查询。您在屏幕截图中删除了该节点的名称,但这是您标记的第二行。
  2. 在第二行中,我们创建一个查询集合下每个子节点的id属性。
  3. 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("")){ 
+0

我编辑了我的代码与您的建议,但现在它不返回给我。 –

+0

我在我的最初片段中发生了错误。我只是解决了这个问题,所以看看能否解决你现在遇到的问题。 –

+0

我用第二种方法,它不返回任何值 –

0

尝试改变这一点:

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(“”)) –