简体   繁体   中英

Firebase orderByChild in android; can't get it to work

I have data structure as:

https://law-apps-44h221543638e.firebaseio.com/apps to promote/0/ >> name:"First App", package:"fra"
https://law-apps-44h221543638e.firebaseio.com/apps to promote/1/ >> name:"Second App", package:"sca"
https://law-apps-44h221543638e.firebaseio.com/apps to promote/2/ >> name:"Third App", package:"tha"

and I query it using

Firebase myFirebaseReference = new Firebase("https://law-apps-44h221543638e.firebaseio.com/apps to promote");
Query queryRef = myFirebaseReference.orderByChild("name");

queryRef.addListenerForSingleValueEvent(new ValueEventListener() { // override methods })

But it returns the data in the same order ie sorted by the first child (1,2,3, etc.) How should I query it so it sorts the data by the "name" tag of each child?

Ok so I found the answer to this question and I am writing it so others may benefit from it. I was using an older technique wherein I was finding from datasnapshot my apps using their parents' numbers and due to this, I was delibrately undoing the ordering.

Now I have used dataSnapshot.getChildren().iterator() and it is now working correctly. Here's the code:

Query queryRef = myFirebaseReference.orderByChild("name");

    queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

    String name;
    String my_package;

    long lengthOfForLoop = dataSnapshot.getChildrenCount();
    Iterator<DataSnapshot> child = dataSnapshot.getChildren().iterator();
    for (int i = 0; i < lengthOfForLoop; i++) {
            DataSnapshot next = child.next();
            name = next.child("name").getValue(String.class);
            my_package = next.child("package").getValue(String.class);
              // do something with this data.
               }
        }
    });
}

thanks, Usman!

I used the same code with the children iterable collection in a for loop. This code was worked for me (in Kotlin):

 accountsReference.child(accountId).child("actions").orderByChild("actionPosition").addListenerForSingleValueEvent( object : ValueEventListener {
            override fun onDataChange(var1: DataSnapshot) {
                if (var1.children != null) {
                    for (actionsEntries in var1.children) {
                       ...
                    }
                }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM