Cavid
Cavid

Reputation: 1

Firebase Query startAt()

my database view

I am using a query and having some trouble. I want retrieve value from 5th to 10th. I try to use startAt () the query just doesn't get anything.

public void read(){

    Query query = FirebaseDatabase.getInstance().getReference("values").orderByChild("timestamp").startAt(5).endAt(10);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot data: dataSnapshot.getChildren()){
                Value upload = data.getValue(Value.class);
                mUploads.add(upload);
                adapter.notifyDataSetChanged();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(MainActivity.this, "Loading Quote failed", Toast.LENGTH_SHORT).show();
        }
    });
}

Upvotes: 0

Views: 610

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 598765

Tl;DR: Firebase database queries are cursor based, and not offset based.

When you call startAt() you have to pass in the value of the timestamp you want to start returning results at. You can't pass in offsets, as you are trying to do now.


You current code:

FirebaseDatabase.getInstance()
    .getReference("values")
    .orderByChild("timestamp")
    .startAt(5)
    .endAt(10);

Tells the database to:

  1. Find the node called values under the root.
  2. Order each child node by its timestamp value.
  3. Then find a child node with value 5 and start returning results from there.
  4. Stop returning results once it finds a child node with value 10.

As you can probably see, this won't give you any results, since none of your child nodes have a timestamp value between 5 and 10.


As said: Firebase queries are cursor based, meaning they work on knowing something about the node to start at. While many databases paginate based on offsets, Firebase doesn't and you'll need to know the timestamp value of the node to start at.

For example, if you want to start at the node you have opened in your screenshot, and then return the next 5 results, you'd do:

FirebaseDatabase.getInstance()
    .getReference("values")
    .orderByChild("timestamp")
    .startAt(-1590413110563)
    .limitToFirst(5);

Upvotes: 1

Related Questions