Firebase 데이터베이스를 쿼리 할 때 OnDataChange 내부의 ArrayList에 항목을 추가하는 방법

하이다르 해무 드

firebase를 사용하고 있으며 firebase 함수를 사용하여 데이터를 올바르게 쿼리하려고합니다. 내가 사용하고있는 데이터베이스의 여러 부분에서 데이터를 쿼리하는 솔루션은 내가 매우 반대하고 확실하지 않으며 다음과 같이 전체 데이터베이스에 단일 값 이벤트에 대한 리스너를 추가하는 것입니다.

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
myRef.addListenerForSingleValueEvent(...)).

내가 듣고 싶은 것은 내가 듣고있는 데이터베이스 부분에 대해 적절한 쿼리를 사용하고 값 이벤트 리스너 함수 외부의 데이터를 기억하는 것입니다.

Query lastMessageQuery = myRef.child("chat_messages").child(currChatID).orderByKey().limitToLast(1);
lastMessageQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot lastMessageSnapshot) {
        for(DataSnapshot currMessageSnapshot: lastMessageSnapshot.getChildren()) {
            Message lastMessage = currMessageSnapshot.getValue(Message.class);

            if (lastMessage != null) {
                MessageViewBox currMessageView;
                if (isGroup) {
                    currMessageView = new MessageViewBox(
                            lastMessage.getMessage_text(), chatName, chatIcon, lastMessage.getTime_sent(), currChatID, true
                    );
                } else {
                    currMessageView = new MessageViewBox(
                            lastMessage.getMessage_text(), chatName, chatIcon, lastMessage.getTime_sent(), otherUserID, false
                    );
                }
                messageFields.add(currMessageView);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

Collections.sort(messageFields);
L_MessageListingAdapter messagesAdapter = new L_MessageListingAdapter(
        mView.getContext(), R.layout.a_person_item, messageFields);
mListView.setAdapter(messagesAdapter);

내가 겪고있는 문제는 listview를 내 messageFields ArrayList로 채우고 싶을 때 목록이 모든 요소를 ​​잊어 버렸다는 것입니다.

현재 저는 네 가지 작업 솔루션을 알고 있습니다.

  1. 처음에 설명한대로 수행하고, 전체 데이터베이스에 값 이벤트 리스너를 추가하고, 현재 채팅에 대한 모든 메시지가 포함 된 스냅 샷으로 이동 한 다음 끝까지 반복 할 수 있습니다. 분명히 이것은 바람직하지 않으며 끔찍하게 확장됩니다.

  2. 데이터베이스의 별도 부분에 각 채팅에 대한 마지막 메시지 ID를 저장하고 전체 데이터베이스에서 수신 대기하는 방식을 사용한 다음 각 채팅에 대한 마지막 메시지 정보를 얻기 위해 반복 할 값이 하나뿐입니다. 그러나 위에서 설명한 쿼리 기능이 완벽하게 작동하기 때문에 이것이 필요하다고 생각하지 않습니다.

  3. 다음과 같이 전화 할 수 있습니다.

    Collections.sort(messageFields);
    L_MessageListingAdapter messagesAdapter = new L_MessageListingAdapter(
        mView.getContext(), R.layout.a_person_item, messageFields);
        mListView.setAdapter(messagesAdapter);
    

    ArryList에 항목을 추가 한 후 쿼리 함수 내부에서, 그러나 이것은 각 채팅에 대해이 코드 세그먼트를 반복하고, 내가 거쳐야하는 많은 채팅에 대한 목록을 다시로드합니다. 이는 다시 바람직하지 않으며 가장 큰 문제입니다. 이 접근 방식은 내가 겪고있는 더 큰 문제를 해결하지 못한다는 것입니다. 이것은이 특정 상황에 대한 문제 일뿐만 아니라 제가 겪고있는 많은 상황에 대한 문제입니다.

  4. [희망] 그래서 이것은 제가 해결해야 할 가장 논리적 인 문제를 가져 왔습니다. 이것은 쿼리 함수 밖에서 쿼리 된 데이터를 살아있게 유지하는 문제입니다.

나는 (4)가 가능하다는 것을 거의 확신하고 그것이 모범 사례 인 것처럼 보이지만 이것을 우아한 방법으로 달성하는 방법을 잘 모르겠습니다. ArrayList를 private, private static, public 및 public static으로 만들려고했습니다. 이 중 아무것도 작동하지 않습니다.

질문이 명확하기를 바라며,이 문제를 해결할 수있는 조언에 감사드립니다.

알렉스 마모

이러한 Message클래스 개체를 메서드 messageFields내부 목록에 추가 할 수 없으며이 onDataChange()메서드 외부에 채워진 동일한 목록을 볼 수 없습니다 . 목록은 onDataChange()메서드 의 비동기 동작으로 인해 항상 비어 있습니다 . 즉, 데이터베이스에서 데이터를 가져 오기 전에도이 메서드가 호출됩니다. 따라서 빠른 해결 방법은 메서드 내에서 해당 목록을 사용하거나이 게시물 에서 내 답변의 마지막 부분을 읽어이 비동기 메서드를 처리하는 것 입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사