Firebase分页limitToFirst()vs limitToLast()

时间:2017-02-10 12:52:57

标签: android firebase pagination firebase-realtime-database

我试图在android中实现Firebase,我对此几乎没有疑问,如果你能帮助我,我会很高兴的。有点困惑。所以这是我的问题。

我正在listview中显示Firebase聊天,其中我只想从firebase加载前100条消息,之后用户将执行pull-to-refresh然后加载前200条消息,依此类推。

enter image description here

为此,我正在寻找limitToFirst()limitToLast(),不知道哪一个更好。

任何人都可以帮忙。

3 个答案:

答案 0 :(得分:3)

我用这种方式做了几乎相同的事情:

在你的课堂上(我假设这是一个活动),创建一个0类型的成员变量:

Query

private Query queryChat; 方法中,开始执行查询:

onStart

@Override public void onStart() { super.onStart(); // initialize your value event listener queryChat= mFirebaseDatabaseReference. .orderByChild("timestamp") .limitToLast(pageSize); queryChat.addListenerForSingleValueEvent(yourValueEventListener); } pageSize变量,此处必须设置为100。

这样做,您首先要对邮件进行升序排序(因此,生成的有序列表中的第一条消息是最早的),然后您将选择最后int条消息(所以, pageSize最后按时间顺序排列)。因此,您将获得第一个(按时间顺序,从最新的pageSize消息开始。

我想你已经在这里实现了pageSize。此外,ValueEventListener是firebase消息中的一个字段,您在其中存储了消息的时间戳(以毫秒为单位)。

现在,在您的类中定义一个方法,如下所示:

timestamp

这里的private void loadMoreItems() { queryChat= mFirebaseDatabaseReference. .orderByChild("timestamp") .endAt(messageList.get(messageList.size()-1).getTimestamp()) .limitToLast(pageSize); queryChat.addListenerForSingleValueEvent(yourValueEventListener); } 是一个存储聊天消息的ArrayList,当你从firebase获取消息时,它会在ValueEventListener中填充。

在这里,我告诉firebase执行升序(如前所述),但只选择时间戳< =用户已经看过的最后一项的项目。(messageList告诉firebase正是这样),最后是.endAt(messageList.get(messageList.size()-1).getTimestamp())

现在您可以随时调用此方法(limitToLast)(在您的情况下,当用户拉动刷新时)。

答案 1 :(得分:1)

您可以尝试这种方式:

int mPageEndOffset = 0;
int mPageLimit = 10;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    connectDetector = new ConnectDetector(getActivity());
    if(connectDetector.getConnection()) {

        alanRef = new Firebase(firebaseURL).child(EventChatActivity.SuperCateName + "/ " + eventDetail.getCategory_name() + "/ " + eventDetail.getEvent_title() + "/ " + EventChatActivity.eventID).child("StadiumChat");
        alanQuery = alanRef.limitToFirst(mPageLimit);
        userName = MyApp.preferences.getString(MyApp.USER_NAME, null);

        EventChatActivity.eventID).child("StadiumChat");
    }
}    

这将从firebase获取最新10条消息的记录。

答案 2 :(得分:-3)

这是两者之间的比较。两者都可以完成这项任务,这取决于你将来对它的看法。

来自Firebase reference documentation

  

<强> limitToFirst

     

生成一个新的Query,仅限于第一个特定数量的孩子。

     

limitToFirst()方法用于设置要为给定回调同步的最大子项数。如果我们将限额设置为100,我们最初只会收到最多100个child_added个事件。如果我们的数据库中存储的消息少于100条,则会为每条消息触发child_added个事件。但是,如果我们有超过100条消息,我们只会收到前100条有序消息的child_added事件。随着项目的更改,我们将收到从活动列表中删除的每个项目的child_removed个事件,以使总数保持为100。

     

<强> limitToLast

     

生成一个新的Query对象,该对象仅限于最后一个特定数量的子项。

     

limitToLast()方法用于设置要为给定回调同步的最大子项数。如果我们将限额设置为100,我们最初只会收到最多100个child_added个事件。如果我们的数据库中存储的消息少于100条,则会为每条消息触发child_added个事件。但是,如果我们有超过100条消息,我们只会收到最后100条有序消息的child_added事件。随着项目的更改,我们将收到从活动列表中删除的每个项目的child_removed个事件,以使总数保持为100。