使用ValueEventListener进行查询

时间:2017-11-28 08:21:50

标签: android firebase firebase-realtime-database

我刚开始使用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);

我做错了什么?

1 个答案:

答案 0 :(得分: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不同的节点内循环,以便在不循环的情况下获取值。