2017-06-19 166 views
0

我試圖顯示零件的「loc」,如果它的零件編號給出的話。 這裏是數據結構是什麼樣子:無法從Firebase實時數據庫檢索數據

{ 
"parts":{ 
    "14521845": { "name":"TOOL EC160B/EC180B/EC210B/EC240", "loc":"EXC1", "sloc":"B3EGU01C03"}, 
    "12829050": { "name":"SWITCH; IGNITION SWITCH", "loc":"PS01", "sloc":"85-06-013"}, 
    "12829050": { "name":"SWITCH; IGNITION SWITCH", "loc":"COM1", "sloc":"B3RGK03D06"}, 
    "20044893": { "name":"PARTS CATALOG_ENG_SPA_FRE_GER_KOR_EC210D", "loc":"EXC1", "sloc":"B3EGT01B02"} 
} 
} 

活動代碼:

FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance(); 
DatabaseReference databaseReference =firebaseDatabase.getReference("parts/"+curP); 

      databaseReference.addChildEventListener(new ChildEventListener() { 

       @Override 
       public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

        Products data=dataSnapshot.getValue(Products.class); 
        Log.i("",String.valueOf(data.getLoc())); 

       } 

getLoc是產品類的getter函數,並返回給定curP相應的「祿」。 curP表示子部分中的值。

邏輯似乎對我來說,但我沒有得到一個輸出。我在哪裏錯了?

回答

0

您可以嘗試使用ValueEventListener。如果你想讀取數據一次,以便使用addListenerForSingleValueEvent方法,像這樣:

private void getFirebaseLocValue(int curP) { 
    FirebaseDatabase firebase = FirebaseDatabase.getInstance(); 
    DatabaseReference mDatabase = firebase.getReference("parts"); 

    mDatabase.child(Integer.toString(curP)) 
     .addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if(dataSnapshot.hasChildren()) { 
       Products data = dataSnapshot.getValue(Products.class); 
       Log.e("TAG", data.getLoc()); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

或者你可以使用addValueEventListener,並會得到與任何變化的數據。我真的不認爲ChildEventListener是從Firebase檢索數據的好主意。

+0

這是行不通的,根本沒有輸出 –

1

試試這個

getReference("parts").child(curP).addChildEventListener(new ChildEventListener() { 

      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

       Products data = dataSnapshot.getValue(Products.class); 
       Log.i("", String.valueOf(data.getLoc())); 

      } 
     }); 
+0

試過這個,仍然沒有幫助DatabaseReference databaseReference = firebaseDatabase.getReference(「parts /」)。child(curP); databaseReference.addChildEventListener(新ChildEventListener(){ @Override 公共無效onChildAdded(DataSnapshot dataSnapshot,一個String){ 產品數據= dataSnapshot.getValue(Products.class); tv.setText(data.getLoc()) ; } –

+0

根據提供的信息,我認爲答案是有效的,我認爲你有其他問題 –

0

的問題是,你越來越在onChildAdded()因爲你希望它是不是一個完整的產品對象。

在您的數據庫引用中,您針對的是特定產品("parts/"+curP),但使用的是ChildEventListener。特定產品節點的孩子是name,locsloc,因此onChildAdded()將會多次觸發,並將這些屬性中的每一個單獨作爲dataSnapshot

你可能會用它來獲得整個產品對象的兩個模式有兩種:

  • 添加ChildEventListener直接把「零件」節點,你會得到每一個產品作爲節點的子,或;
  • 如果要將偵聽器直接添加到特定產品的節點,請使用ValueEventListener將整個節點條目作爲一個dataSnapshot
+0

嘗試使用addValueEventListener直接抓取特定產品節點下的Products類的對象,但仍然沒有輸出 –

+0

Then看起來你可能有不止一個問題,但是這個問題中的信息僅僅足以讓我們發現這個問題,你需要檢查其他的東西,比如你的安全規則,Product.class是正確構造,如果dataSnapshot.toString()返回任何東西,如果控制檯中有錯誤消息等。 –