2017-08-02 223 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(「」)) –