【问题标题】:firebase startAt() endAt() methodsfirebase startAt() endAt() 方法
【发布时间】:2017-01-17 03:46:44
【问题描述】:

我想使用startAt()endAt() 方法,但我不完全了解它们的工作原理。

假设我有当前数据库

"users" : {
    "someUser1" : {
      "email" : "oneEmail",
      "someOtherInfo" : "OneInfo",
      "username" : "someUser1"
    }
    "someUser2" : {
      "email" : "twoEmail",
      "someOtherInfo" : "twoInfo",
      "username" : "someUser2"
    },
    "someUser3" : {
      "email" : "threeEmail",
      "someOtherInfo" : "threeInfo",
      "username" : "someUser3"
    },
    "someUser4" : {
      "email" : "fourEmail",
      "someOtherInfo" : "fourInfo",
      "username" : "someUser4"
    }
  }

现在这些数据将被附加到 RecyclerView。所以最初我只想获取前 2 个元素(someUser1someUser2),然后当用户滚动到 recyclerView 的底部时,它会获取其他 2 个元素。

recyclerView 已完全设置并正常工作,我现在只需要从数据库中获取元素,但我不明白这两种方法是如何工作的,如果我这样做了:

users = myDB.getReference("users").orderByChild("email").startAt(0).endAt(2);

这足以获得前 2 个元素吗?

谢谢

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    你可以通过limitToLast()来做,代码如下:

    DatabaseReference node;
    
    node.limitToLast(AppConstants.SIZE)
                        .orderByChild(YourOwnSortMethod)
                        .addValueEventListener(mValueEventListener);
    
    private ValueEventListener mTypingValueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                Log.i(TAG, "onDataChange: " + snapshot.getValue());
                // Your code
            }
    
            @Override
            public void onCancelled(DatabaseError error) {
                Log.w(TAG, "onCancelled: " + error.getMessage());
            }
        };
    

    这是做什么的,

    数据集 = A、C、B、E、F

    orderByChild(升序)= A、B、C、E、F

    limitToLast (2) = E, F

    【讨论】:

    • 如果我们有您提供的数据集,我想先检索 A、C,然后在下次调用接收 B、E 和最后一次调用接收 F。同样在您的代码中,它不应该是 .addValueEventListener(mTypingValueEventListener) .addValueEventListener(mValueEventListener)
    • 然后descending数据集。如果要从此 A、C、B、E、F 中获取前两个对象,则必须在创建每个数据集时设置时间戳。然后你可以按时间戳订购:)
    • 好的,我已经接近理解如何做到这一点了。所以我已经为每个数据集设置了一个时间戳,我现在该如何排序?会是 .orderByChild(time),其中 time 是每个数据集的时间戳吗?
    • 你能举个例子吗?这将是非常合适的
    • @TerribleCoderSad 请参阅以下答案。谢谢!
    【解决方案2】:

    请参阅以下附件:

    DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance()
                    .getReference();
    DatabaseReference mRef = mDatabaseReference.child("order")
    
    node.limitToLast(2).orderByChild("timestamp")
                       .addValueEventListener(mValueEventListener);
    
    private ValueEventListener mTypingValueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                Log.i(TAG, "onDataChange: " + snapshot.getValue());
                // Your code
            }
    
            @Override
            public void onCancelled(DatabaseError error) {
                Log.w(TAG, "onCancelled: " + error.getMessage());
            }
        };
    

    【讨论】:

    • 推送元素具有基于当前时间戳的唯一 id(与服务器时间匹配的偏移量)。这意味着每条记录在最后自然排序,并且它们保持时间顺序。 firebase.googleblog.com/2014/04/… 不需要显式存储时间戳。
    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多