Android Firebase分页limitToFirst()与limitToLast()的比较

Android Firebase分页limitToFirst()与limitToLast()的比较,android,firebase,pagination,firebase-realtime-database,Android,Firebase,Pagination,Firebase Realtime Database,我试图在安卓系统中实现Firebase,对此我有一些疑问,如果您能帮助我,我将非常高兴。有点糊涂了。这是我的问题 我在listview中显示Firebase聊天,在用户执行pull刷新后,我只想从Firebase加载前100条消息,然后加载前200条消息,依此类推 为此,我在查看limitToFirst()和limitToLast()中,不知道哪一个更好 任何人都可以帮忙。我用这种方式做了几乎相同的事情: int mPageEndOffset = 0; int mPageLimit = 10;

我试图在安卓系统中实现Firebase,对此我有一些疑问,如果您能帮助我,我将非常高兴。有点糊涂了。这是我的问题

我在
listview
中显示Firebase聊天,在用户执行
pull刷新后,我只想从Firebase加载前100条消息,然后加载前200条消息,依此类推

为此,我在查看
limitToFirst()
limitToLast()
中,不知道哪一个更好


任何人都可以帮忙。

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

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");
    }
}    
在类中(我假设这是一个活动),创建
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
是一个
int
变量,这里必须设置为100

通过这种方式,您首先对消息进行升序(因此,结果排序列表中的第一条消息是最早的),然后选择最后一条
pageSize
消息(因此,
pageSize
按时间顺序排列)。因此,您将获得第一条(按时间顺序,从最新的开始)
pageSize
消息

我假设您已经在这里实现了一个
ValueEventListener
。另外,
timestamp
是firebase消息中的一个字段,您在其中以毫秒为单位存储消息的时间戳

现在,在类中定义如下方法:

private void loadMoreItems() {

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


在这里,我告诉firebase按升序(和以前一样),但只选择带有时间戳的项目我用这种方式做了几乎相同的事情:

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");
    }
}    
在类中(我假设这是一个活动),创建
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
是一个
int
变量,这里必须设置为100

通过这种方式,您首先对消息进行升序(因此,结果排序列表中的第一条消息是最早的),然后选择最后一条
pageSize
消息(因此,
pageSize
按时间顺序排列)。因此,您将获得第一条(按时间顺序,从最新的开始)
pageSize
消息

我假设您已经在这里实现了一个
ValueEventListener
。另外,
timestamp
是firebase消息中的一个字段,您在其中以毫秒为单位存储消息的时间戳

现在,在类中定义如下方法:

private void loadMoreItems() {

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

在这里,我告诉firebase按升序(如前所述),但只选择带有时间戳的项目,您可以这样尝试:

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条消息的记录。

您可以尝试以下方法:

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条消息的记录。

谢谢您的回答,我想加载最新的100条消息,然后如果用户拉刷新加载200条最新消息等等,那么哪一条最适合这种情况。您所说的“哪一条最适合这种情况”是什么意思?@Valentino我想知道在我的案例中使用哪一个?这取决于你如何订购orderByChild。正如您在这个答案中所看到的,将limitToLast与orderByChild和endAtHi结合使用非常简单,@valentinoS。我试着按照你的建议做,但我总是得到同样的东西。。。我在新的线程中键入了我的问题。你会来帮助我的。谢谢你的回答,我想加载最新的100条消息,然后如果用户拉刷新加载200条最新消息等等,那么哪一条最适合这种情况。你说的“哪一条最适合这种情况”是什么意思?@Valentino我想知道在我的情况下使用哪一条?这取决于你如何订购orderByChild。正如您在这个答案中所看到的,将limitToLast与orderByChild和endAtHi结合使用非常简单,@valentinoS。我试着按照你的建议做,但我总是得到同样的东西。。。我在新的线程中键入了我的问题。你会来帮助我的@弗兰克·范·帕夫伦我希望你能回答这个问题,这对我来说非常宝贵。@Maveň谢谢你的赏金,我的朋友,我现在得到了一个正确的答案。@Frank van Puffelen我希望你能回答这个问题,这对我来说非常宝贵。@Maveň谢谢你的赏金,我的朋友,我现在得到了正确的答案。