我有一個firebase
數據庫,我可以從中保存和檢索數據。我知道datasnapshot
如何在addValueEventListener
內工作。問題在於,只有在firebase
數據庫檢測到其數據更改時纔會調用或觸發此操作。我只想訪問數據並閱讀它,以便能夠將其存儲在數組列表或相同的事物中。Firebase數據庫Datasnapshot
我有這樣的代碼:
public void foo(){
DatabaseReference x= FirebaseDatabase.getInstance().getReference().child("x");
reservations.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String userID = client.getId();
for(DataSnapshot snap : dataSnapshot.getChildren()){
if(snap.child("someId").equals(someId)) number++;
if(snap.child("userID").getValue().equals(client.getId())){
isAlreadyReserved = true; // if user has already reserved the item
alreadyReserved();
break;
}
Log.e("isAlreadyReserved: ", isAlreadyReserved+"");
numberOfReservations++;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if(isAlreadyReserved) {
alreadyReserved();
}
else if(number == numberOfCopies){
// material is no longer available
OtherActivity.showMaterialUnavailable();
}
else{
Reservation reservation = new Reservation();
reservation.setBookId(this.bookId);
reservation.setResID((numberOfReservations+1)+"");
reservation.setUserID(client.getId());
String key = reservations.push().getKey();
reservations.child(key).setValue(reservation);
Log.e("Reservations: ", "reserve successful");
AlertDialog.Builder builder = new AlertDialog.Builder(this.context);
builder.setTitle(R.string.reservationSuccess_title)
.setMessage(R.string.reservationSuccess_body);
AlertDialog dialog = builder.create();
dialog.show();
}
}
你可以看到,裏面onDataChange
我只算材料,並設置一些標誌,我可以推測的ValueEventListener
外面做。 但我注意到這是錯誤的,因爲僅在寫入Firebase
數據庫時調用onDataChange
。這不應該是這種情況。
如何在不調用onDataChange
或不使用DataSnapshot
的情況下循環訪問DatabaseReference x
中的值?
謝謝!我已經解決了我的問題。我使用了一個'AsyncTask'來對Firebase實時數據庫進行REST調用,並使用它來在啓動它的'ValueEventListener'的'onDataChange()'方法之前預處理我需要的數據。這樣,我可以在數據處理後的恰當時間調用'onDataChange()'。 – JeobMallari
很高興聽到這個消息。乾杯! –