Android Firebase数据库数据快照
我有一个Android Firebase数据库数据快照,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我有一个firebase数据库,从中保存和检索数据。我知道datasnapshot如何在addValueEventListener中工作。问题在于,只有当firebase数据库检测到其数据发生变化时,才会调用或触发此操作。我只想访问数据并读取它,以便能够将其存储在arraylist或类似的东西中 我有这样一个代码: public void foo(){ DatabaseReference x= FirebaseDatabase.getInstance().getReference().c
firebase
数据库,从中保存和检索数据。我知道datasnapshot
如何在addValueEventListener
中工作。问题在于,只有当firebase
数据库检测到其数据发生变化时,才会调用或触发此操作。我只想访问数据并读取它,以便能够将其存储在arraylist或类似的东西中
我有这样一个代码:
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
中的值 为了获取DatabaseReference x的值,应该使用addListenerForSingleValueEvent
x.addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
//do something
}
@Override
public void onCancelled(DatabaseError databaseError)
{
//do something
}
});
如firebase文档中所述:
public void addListener for SingleValueEvent(ValueEventListener
(听众)
为中的单个更改添加侦听器
此位置的数据。此侦听器将使用
该位置的数据值
如果不使用
侦听器,则无法在数据库引用中循环。当我们谈论Firebase时,我们只谈论侦听器
。因此,为了获得这些值,您需要使用侦听器,然后从dataSnapshot
中获取数据
我认为您的问题是,在您的案例中,onDataChange
方法是以异步方式调用的。这意味着在调用onDataChange
方法之前,您在该方法之外执行的所有操作实际上都已执行。所以为了理解实际发生了什么,请看这个和这个。阅读这篇文章,将教你如何查询Firebase中的数据,以及如何从Firebase异步检索数据
希望有帮助。谢谢您的回答,但我认为问题仍然存在。只有当DatabaseReference x
对Firebase实时数据库执行更改时,才会调用此addListenerForSingleValueEvent
函数。我需要它像这样运行:从实时数据库获取数据
->处理数据
->对实时数据库执行必要的更改
,它是这样的:执行更改以触发侦听器
->从侦听器获取数据
->处理数据
->在实时数据库中执行更改
此事件只发生一次,设置它后,它不会仅在数据更改后发生。你试过了吗?是的,我试过了。这并不能解决问题。它仍然需要更改数据来执行该过程。在执行数据更改之前,我需要先读取值。这是有线的,对我来说很有用。什么时候调用foo方法?这可能有问题。我在警报对话框的onclick侦听器中调用它。错误并不存在。我已经在考虑在asynctask中使用rest调用只是为了查看内容并获取所需的数据,而不是执行数据更改来读取数据,然后再进行另一次数据更改。谢谢!虽然我已经解决了我的问题。我使用一个AsyncTask
对Firebase
实时数据库进行REST调用,并使用它在触发其ValueEventListener
的onDataChange()
方法之前预处理所需的数据。这样,我就可以在数据处理后的适当时间调用onDataChange()
。很高兴听到这个消息。干杯