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()
。很高兴听到这个消息。干杯