我想对Firebase RealTimeDatabase中的数据进行排序。我想做的是,当我首先加载数据时,它将从我放入的子值开始,例如“ 7”,然后它将基于子“ NUMBER”值以升序和limitToFirst( 2)数据。但是日志始终显示dataSnapshot不存在。
这是我的代码
用于加载数据的代码
private void testData(){
final ArrayList<FirebaseDatabaseGetSet> testArrayList;
testArrayList = new ArrayList<>();
databaseReference = firebaseDatabase.getReference();
databaseReference.child("VTEST").orderByChild("NUMBER").startAt("7").limitToFirst(2).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
Log.d("MOSTPOPCURRENTLASTNODE", "LOAINGMOREDATA");
for (DataSnapshot DS:dataSnapshot.getChildren()){
FirebaseDatabaseGetSet getSet = DS.getValue(FirebaseDatabaseGetSet.class);
testArrayList.add(getSet);
}
Log.d("MOSTPOPCURRENTLASTNODE", String.valueOf(testArrayList.get(0).getNUMBER()));
Log.d("MOSTPOPCURRENTLASTNODE", String.valueOf(testArrayList.get(1).getNUMBER()));
}else {
Log.d("MOSTPOPCURRENTLASTNODE", "NOLOAINGMOREDATA");
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
这是我的Firebase数据结构
数据结构
"VTEST" : {
"A" : {
"NUMBER" : 5
},
"B" : {
"NUMBER" : 3
},
"C" : {
"NUMBER" : 7
},
"D" : {
"NUMBER" : 10
},
"E" : {
"NUMBER" : 12
},
"F" : {
"NUMBER" : 8
}
}
我从日志中期望的是“ 7”和“ 8”,但是它始终显示dataSnapshot不存在。有人可以告诉我我在这里做错什么吗,我已经尝试寻找其他一些类似的问题,但是找不到任何解决方案。
答案 0 :(得分:1)
您的过滤依据:
databaseReference.child("VTEST").orderByChild("NUMBER").startAt("7")
您正在存储:
"NUMBER" : 7
如果仔细看,您会看到一个是字符串,另一个是整数。并且在Firebase Realtime数据库中,不同类型的值永远不会相等。
要解决此问题,请按数值过滤:
databaseReference.child("VTEST").orderByChild("NUMBER").startAt(7)
答案 1 :(得分:0)
尝试这个,我通过将它的子级缩短来获取数据:-
mChatReference = FirebaseDatabase.getInstance().getReference(VTEST)
.child("user id");
Query query = mChatReference.orderByChild("NUMBER");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
yourList.add(snapshot.child("NUMBER").getValue());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});