我有一个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
很高兴听到这个消息。干杯! –