2017-08-05 38 views
0

我首先想檢查哪個節點有當前用戶的用戶標識。這一步工作正常。它給出了正確的價值。接下來,我想在該節點(1或2)中搜索以找到該節點內的哪個用戶標識符具有名爲「type」的具有值「driver」的子類。我想找到type =「driver」的用戶標識。如果在知道值的情況下如何在firebase數據庫中找到密鑰?

當前的代碼是

mDatabaseReference = FirebaseDatabase.getInstance().getReference(); 
busReference = mDatabaseReference.child("Busno"); 
mUser = FirebaseAuth.getInstance().getCurrentUser(); 
assert mUser != null; 
userid = mUser.getUid(); 


busReference.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot ds : dataSnapshot.getChildren()){ 
      usercount = ds.getChildrenCount(); 
      for(int i = 1; i <= usercount; i++){ 
       if(ds.hasChild(userid)){ 
        busno = ds.getKey(); 
        driverReference = mDatabaseReference.child("Busno").child(busno); 

        driverReference.addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          for(DataSnapshot ds1 : dataSnapshot.getChildren()) { 

           // I need help in this place. 

          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { } 
        }); 
        break; 
       } 
      } 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { } 
}); 

My database

+0

你找到答案了嗎?如果沒有,我會發布我的。 – UmarZaii

+0

@UmarZaii請發表您的回答 –

回答

0

爲了讓孩子密鑰嘗試:

ds1.getKey(); 
+0

但我想要一個孩子名爲類型的兒童鑰匙應該是「驅動程序」而不是「父母」的值。所以,我只是想讓驅動程序的userid –

+0

@AjayReal做這個邏輯,得到ds1類型,並檢查是否是驅動程序,如果是的話獲得密鑰,否則不要做這樣的事情: ** String type = ds1.child(「type」)。的getValue(String.class); if(type.equals(「driver」)){ //獲得密鑰 } ** –

0

使用查詢以查找驅動程序:

DatabaseReference busRef = ds.getRef(); // no need to rebuild this ref, but I'd recommend rename ds to something more meaningful 
Query driverQuery = busRef.orderByKey("type").equalTo("driver"); 
driverQuery.addListenerForSingleValueEvent(new ValueEventListener() {   
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot driverSnapshot : dataSnapshot.getChildren()) { 
      System.out.println(driverSnapshot.getKey()); 
     } 
    } 
    ... 

這個 將工作,但我建議認真反思你的數據結構。利用你的域的數據模型,提出一個有效的結構,允許你的用例。

例如:如果總線只能有一個驅動程序,爲什麼不知道司機是一個頂級集合每個總線的屬性:

drivers: { 
    "1": "mlxMu..." 
} 

這樣,您可以直接仰望驅動程序,而不必查詢他們:

Query driverRef = ref.getChild("drivers").getChild(busno); 
driverQuery.addListenerForSingleValueEvent(new ValueEventListener() {   
    public void onDataChange(DataSnapshot dataSnapshot) { 
     System.out.println(dataSnapshot.getValue(String.class)); 
    } 
    ... 

事實上,有這種數據結構,它可能是簡單的非常可行保持drivers列表在內存中,避免嵌套的監聽器。這極大地提高了代碼的可讀性/可維護性。

相關問題