我刚开始使用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);
我究竟做错了什么?
请这样做:
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
不同的节点内循环,在那里它能够获得没有循环的值。