как получить данные в диапазоне, используя временную метку - Firebase, Android, База данных в реальном времени - PullRequest
0 голосов
/ 20 сентября 2018

Я использую базу данных Firebase в реальном времени для хранения и извлечения данных, но по какой-то причине я не могу добиться того, чего хочу.

Я хочу получать 20 записей за раз при обновлении смахивания.

Мои данные выглядят так: data structure

Изначально я загружаю 50 записей:

chat.limitToLast(default_num_of_messages).addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                Map map = dataSnapshot.getValue(Map.class);
                String user_id =  map.get("user_id").toString();
                String message = map.get("message").toString();
                String timestamp = map.get("timestamp").toString();

                Log.d("MAP", map.toString());
                ChatMessage chat_message = new ChatMessage();
                chat_message.setUser_id(user_id);
                chat_message.setMessage(message);
                chat_message.setTimestamp(Long.parseLong(timestamp));
                Log.d("CHAT MSG", chat_message.toString());

                if(Integer.parseInt(user_id) == Utils.getInstance().getLoggedInUser().getId()) {
                    addMessageBox(chat_message, 1);
                }
                else{
                    addMessageBox(chat_message, 2);
                }
            }

после обновления я хочузагрузить еще 20.Я пытаюсь сделать что-то вроде этого.но, похоже, он не возвращается.

@Override
public void onRefresh() {
    if(refresh_toggle) {
        swipe_view.setRefreshing(true);
        Log.d("CHAT", "REFRESHED!!!");
        //reload new data
        chat.orderByChild("timestamp").endAt(10).addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                Map map = dataSnapshot.getValue(Map.class);
                String user_id =  map.get("user_id").toString();
                String message = map.get("message").toString();
                String timestamp = map.get("timestamp").toString();

                Log.d("CHATS", map.toString());
                ChatMessage chat_message = new ChatMessage();
                chat_message.setUser_id(user_id);
                chat_message.setMessage(message);
                chat_message.setTimestamp(Long.parseLong(timestamp));

                swipe_view.setRefreshing(false);
                if(Integer.parseInt(user_id) == Utils.getInstance().getLoggedInUser().getId()) {
                    addMessageBox(chat_message, 1);
                }
                else{
                    addMessageBox(chat_message, 2);
                }
            }

            @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(FirebaseError firebaseError) {}
        });
    }
}

Как видите, я пытаюсь упорядочитьByChild "timestamp", а затем пробовал другую комбинацию startAt (), endAt (), но, похоже, ничего не работает.

1 Ответ

0 голосов
/ 20 сентября 2018

Попробуйте:

 int number_item_load = 10; //changed number if you want
    public void loadMore(int offset, String theLastValue) {
        // theLastValue: depend on your orderByChild() 's value
        mDatabase = FirebaseDatabase.getInstance().getReference().child(Utils.FB_ROOT);
        mEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                if (isAlreadyAttach()) {
                    // Get your item and callback to view and insert to listView
                }
            } ...
        };


        mDatabase.orderByChild("yourvalue").startAt(theLastValue).limitToFirst(number_item_load ).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                // TODO Finished loaded number_item_load  item
                OnLoadedFinish(); // 
                mDatabase.removeEventListener(mEventListener); // Remove listener after load
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        mDatabase.orderByChild("yourvalue").startAt(theLastValue).limitToFirst(number_item_load ).addChildEventListener(mEventListener);
    }

В моем случае все работало идеально.Гудлак

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...