Android如何让Firebase数据库中的数据与orderByChild()&startAt()&limitToFirst()相结合?

时间:2019-04-15 03:41:15

标签: java android firebase firebase-realtime-database

我想对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不存在。有人可以告诉我我在这里做错什么吗,我已经尝试寻找其他一些类似的问题,但是找不到任何解决方案。

2 个答案:

答案 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) {

            }
        });