使用ValueEventListener进行查询

问题描述 投票:1回答:1

我刚开始使用Android和Firebase。我已经构建了一个简单的测试Firebase数据库,我想运行一个简单的查询。

如果我使用ChildEventListener,我会得到合理的结果和代码,如下所示: -

Query query = databaseReference.orderByChild("calendarGroup").equalTo("2");

    mChildEventListner = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            CalendarEntry calendarEntry = dataSnapshot.getValue(CalendarEntry.class);
            linesToDisplay = linesToDisplay + "\n" + calendarEntry.getCalendarDate() +
                    ", " + calendarEntry.getCalendarEntry() +
                    ", " + calendarEntry.getCalendarGroup();
            resultText.setText(linesToDisplay);
        }

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

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
        }

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

        @Override
        public void onCancelled(DatabaseError databaseError) {

            Toast mToast = Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT);
            mToast.show();
            ;
        }
    };

    query.addChildEventListener(mChildEventListner);

但由于这是一个单一的事件查询,我想用SingleValueListener做到这一点。它不起作用(我得到空值),代码如下: -

        Query query = databaseReference.orderByChild("calendarGroup").equalTo("2");

    ValueEventListener mValueEventListener;

    mValueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            CalendarEntry calendarEntry = dataSnapshot.getValue(CalendarEntry.class);
            linesToDisplay = linesToDisplay + "\n" + calendarEntry.getCalendarDate() +
                    ", " + calendarEntry.getCalendarEntry() +
                    ", " + calendarEntry.getCalendarGroup();
            resultText.setText(linesToDisplay);

        }
        @Override
        public void onCancelled (DatabaseError databaseError){
        }


    };

    query.addListenerForSingleValueEvent(mValueEventListener);

我究竟做错了什么?

android firebase firebase-realtime-database
1个回答
0
投票

请这样做:

mValueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
      for(DataSnapshot data : dataSnapshot.getChildren()){

        CalendarEntry calendarEntry = data.getValue(CalendarEntry.class);
        linesToDisplay = linesToDisplay + "\n" + calendarEntry.getCalendarDate() +
                ", " + calendarEntry.getCalendarEntry() +
                ", " + calendarEntry.getCalendarGroup();
        resultText.setText(linesToDisplay);

    }
  }
    @Override
    public void onCancelled (DatabaseError databaseError){
    }


};
query.addListenerForSingleValueEvent(mValueEventListener);

请添加for循环以便能够检索数据。

ValueEventListener中,你必须在与childeventlistener不同的节点内循环,在那里它能够获得没有循环的值。

© www.soinside.com 2019 - 2024. All rights reserved.