마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 파이어베이스 데이터 가져오기[질문 수정]

0 추천

댓글 달아주셔서 감사합니다..제가 질문을 한번에 잘했어야됐는데,,


 

파이어베이스에 sports라는 배열이 있습니다.

//파이어베이스에서 데이타를 읽어올 경로
databaseReference= FirebaseDatabase.getInstance().getReference("sports");
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
            String firemessage = snapshot.getValue().toString();    //문자열로 받기
            message1.add(firemessage);  //리스트에 추가
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Getting Post failed, log a message
    }
});

이렇게 구현해서 버튼을 클릭하면

textView.setText(message1.get(i));       

리스트에서 값을 하나씩 출력되게 하려고 합니다.

근데 지금은 message1의 1번 밖에 못 가져오고 있습니다..어떻게 하면 좋을까요ㅜㅜ도와주세요ㅜ

 

디버깅 결과는 이렇게 나옵니다.

for문 열에 들어오는 값입니다.

for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

DataSnapshot { key = sports, value = {1=축구, 2=야구, 3=컬링, 4=핸드볼, 5=농구, 6=스케이팅, 7=쇼트트랙, 8=스키점프, 9=럭비, 10=미식축구} }

그리고,

String firemessage = snapshot.getValue().toString();    

이 열에는 

snapsho: "DataSnapshot { key=0, value= 축구}"

이렇게 key 0번 밖에 안 나옵니다.. 모든 키 값을 차례대로 넣어 버튼을 눌렀을 때 축구, 야구, 컬링 등 순서대로 출력하고 싶습니다..

현재는 버튼을 누르면 key0번인 축구만 나오고 있습니다.

 

개발개발자 (1,100 포인트) 님이 2021년 1월 16일 질문
댓글로 다시면 되는데, 또 올렸네요.

브레이크 포인트에서 멈춘상태에서 F8을 눌러보세요.
그러면 그 다음 줄에서 멈출 겁니다.
또 F8을 눌러보세요. for 루프를 다시 타겠죠.
계속 F8을 누리면 message1에 추가되는게 보일 겁니다.

제대로 데이터가 추가가 되는지 확인해 보세요.
질문을 다시 보니 당영한데요.

for (DataSnapshot snapshot : dataSnapshot.getChildren())

상기 구문은 dataSnapshot의 하위 목록 중에서 하나씩 하나씩 가져와서
snapshot에 넣어서 처리하고
루프를 도는 것이니까,
dataSnapshot는 다 있고 snapshot은 하나만 있는게 정상이죠.
그래서 message1이라는 배열에 add 해서 하나씩 추가하는 것이잖아요.
디버깅을 F8을 눌러서 계속 따라가보면 로직이 어떻게 돌아가는지 이해가 될 겁니다.

그게 아니라면, 질문을 잘못했거나,
아니면, 언급하지 않은 무언가가 있을 것 같네요.
message1이라는 배열에 add 해서 하나씩 추가가 되어야하는데 key0번 축구만 추가되니,,,답답할 따름입니다,,,ㅠ
will kim님 말씀처럼
            message1.add(firemessage);  //리스트에 추가
이 줄에서 F8을 누르면 key값이 증가하면 데이터가 하나씩 추가됩니다. 이제 어떻게 해야되나요,,,
네 그럼 message1 리스트에 데이터가 정상적으로 들어가면 목적했던 코딩이 완료된 거 아닌가요?
서버에 있는 데이터를 리스트에 잘 넣었다면,
그다음에는 목적하는 UI 작업을 하시면 되는 겁니다.
혹시 실례가 안된다면 https://open.kakao.com/o/sLndGkPc 에 들어와주실 수 있을까요,,,
지금 실행되면         for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
이 for루프가 한번만 실행되어 key0번값만 가져오고 있습니다. 디버깅을 해봤을 때 이 for루프가 계속 돌면 계속 추가가 되는데 for루프를 계속 돌리는 방법이 있을까요??

for (int a=0; a<10; a++) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) { //*a부분
                        String firemessage = snapshot.getValue().toString();    
                        message1.add(firemessage);  
                    }
                }

이렇게 하고 디버깅으로 테스트 해보니깐 주석처리한 a부분만 한번실행됩니다..

1개의 답변

0 추천

로그를 보니까 { key = sports, value = {1=축구, 2=야구, 3=컬링, 4=핸드볼, 5=농구, 6=스케이팅, 7=쇼트트랙, 8=스키점프, 9=럭비, 10=미식축구} }

value에 들어온 데이터가 문자열 배열이 아니라 맵같이 보이네요. Map<Integer, String> 형태로요. value부분을 맵으로 읽으셔야 하는데 배열로 취급하셔서  getChildren으로 접근하니까 하나 밖에 안읽혀지시는듯해요. 아래와 같이 맵으로 읽어 보세요. 데이터 타입은 테스트 하시면서 수정하시구요.

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Map<String, String> sports = (Map) dataSnapshot.getValue();
        
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
      
    }
});

 

spark (226,420 포인트) 님이 2021년 1월 17일 답변
spark님이 2021년 1월 17일 수정
답변 정말 감사합니다ㅜㅜㅜㅜ
...