我试图在android中实现Firebase,我对此几乎没有疑问,如果你能帮助我,我会很高兴的。有点困惑。所以这是我的问题。
我正在listview
中显示Firebase聊天,其中我只想从firebase加载前100条消息,之后用户将执行pull-to-refresh
然后加载前200条消息,依此类推。
为此,我正在寻找limitToFirst()
和limitToLast()
,不知道哪一个更好。
任何人都可以帮忙。
答案 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。