我开始使用firebase,一切看起来都不错,但我在recyclerview
内显示了50k记录,我无法弄清楚如何分页或类似因为一次加载所有内容花了太多时间。
我使用childEventListener
和FirebaseUI也没有运气。
更新1: 最后我开始为更新1工作,这不是最好的解决方案,但我想我稍后会做一些更改。
private String lastKey = null;
private List<Comment> commentList = new ArrayList<>();
private final static int QUERY_LIMIT = 20;
private int page = 0;
private void loadComments() {
page++;
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Comment comment = dataSnapshot.getValue(Comment.class);
commentList.add(comment);
adapter.notifyDataSetChanged();
lastKey = String.valueOf(comment.getTimestamp());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
if (lastKey != null) {
commentList.clear();
adapter.notifyDataSetChanged();
comments.child(id_post).orderByChild("timestamp").endAt(lastKey).limitToLast(QUERY_LIMIT * page).addChildEventListener(childEventListener);
} else {
comments.child(id_post).orderByChild("timestamp").limitToLast(QUERY_LIMIT).addChildEventListener(childEventListener);
}
}
答案 0 :(得分:1)
您可以添加值事件侦听器来限制您希望接收的结果数量,这是firebase-ui的快速示例
ref.limitToLast(5).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot msgSnapshot: snapshot.getChildren()) {
Chat msg = msgSnapshot.getValue(Chat.class);
Log.i("Chat", chat.getName()+": "+chat.getText());
}
}
使用limitToLast(5)方法获取最后添加的5个对象。关于此的其他方法包括limitToFirst(),limitToLast(),startAt(),endAt()和equalTo() 可以找到更多信息Here。
答案 1 :(得分:0)
我正在使用此方法显示实时数据库中存储的8百万条记录,每次分页50条。
private void getUsers(String nodeId) {
Query query;
if (nodeId == null)
query = FirebaseDatabase.getInstance().getReference()
.child(Consts.FIREBASE_DATABASE_LOCATION_USERS)
.orderByKey()
.limitToFirst(mPostsPerPage);
else
query = FirebaseDatabase.getInstance().getReference()
.child(Consts.FIREBASE_DATABASE_LOCATION_USERS)
.orderByKey()
.startAt(nodeId)
.limitToFirst(mPostsPerPage);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
UserModel user;
List<UserModel> userModels = new ArrayList<>();
for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
userModels.add(userSnapshot.getValue(UserModel.class));
}
mAdapter.addAll(userModels);
mIsLoading = false;
}
@Override
public void onCancelled(DatabaseError databaseError) {
mIsLoading = false;
}
});
}
您也不必单独存储最后一个密钥。
如果您无法完全理解,那么您可以read the blog post here which explains everything。