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

안드로이드 파이어베이스 데이터 읽어서 분류하기

0 추천

이번에 처음으로 안드로이드 파이어베이스랑 연동해서 앱 개발중인데요..

데이터 베이스랑 연동해서 데이터 저장하고 데이터를 불러오는 것까지는 했는데 데이터를 불러와서 리스트뷰에 뿌려야 되는데

웹에서 데이터를 불러올때는 불러오고 싶은 값들만 배열식으로 불러오게되는데(만약에 user 안에 있는 uid를 불러오면 모든 사용자들의 uid가 리스트 형식으로 불러와 진다)

안드로이드에서 데이터를 불러올때 dataSnapshot.getValue(String.class); 이렇게 부르면 uid가 불러와지는것이 아니라 uid 안에 있는 자식들의 0번째 요소가 불러와 집니다. 저가 원하는 데이터만 추출하는 방법을 알려주시면 감사하겠습니다

익명사용자 님이 2017년 2월 15일 질문

1개의 답변

0 추천
 
채택된 답변
데이터베이스 참조에 데이터 set 하는 부분 코드랑

데이터 불러오는 부분에서 참조에 이벤트 걸을때 부분 코드좀 보여주실수 있으신가요?

 

#1

   데이터1

   데이터2

#2

   데이터1

   데이터2

 

위에서 #1, #2 가 uid라고 치면 질문자님이 원하는거는 데이터1, 데이터2 가 아니라 그 부모인 #1 부터 얻고 싶다. 라고 이해하고 말씀 드리겠습니다.

dataSnapshot 함수중에 getKey 함수 있지 않나요?

제가 알기로는 getValue 하셨을때 자식이 나왔다면 getKey 하면 그 부모인 uid가 나올것으로 생각이 됩니다.

확인해보세용.
Development Guy (70,570 포인트) 님이 2017년 2월 15일 답변
아니요 그니까 만약에
#user - uid 1 - 시간 - 정보 : 값
                     - 시간2 - 정보 값
            uid 2 - 시간 - 정보 : 값
                      - 시간2 - 정보 : 값

이런식이면 uid1={시간=값{정보=값}뭐 이런식으로 나오는데 딱 0번째 요소만 나옵니다
저가 원하는건 {uid1,uid2,uid3} 이런식인데 getKey써도 안되더라고요
그래서 제가 데이터베이스 참조에 이벤트 거는 부분 코드좀 보고 싶은거에요.
데이터 읽을때 addListenerForSingleValueEvent 함수로 이벤트 걸지 않나요?
질문자 님이 요구하신대로 하려면 참조의 경로를 #user 까지 하고 이 상태에서 이벤트를 걸면 될텐데  제 생각에는 참조의 경로가 #user/uid1/시간 까지 해놓으시고 여기다가 이벤트를 걸으신거 같아요
mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
                mConditionRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                       title = dataSnapshot.getValue().toString();
                       Log.v("data", title);
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });
            }
        };
이렇게 하는게 뭐가 문젠가요??
mConditionRef 참조 경로가 어떻게 되나요?(참고로 참조경로는 mConditionRef.toString() 하면 바로 리턴되는것으로 알고 있습니다.)

질문자님 요구대로 동작하려면 "(버킷URL)/#user" 이렇게 되어 있어야하는데 아마 지금  "(버킷URL)/#user/uid1/시간" 까지 되어 있지 않나요?
DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference mConditionRef = mRootRef.child("photos");
이렇게 해놨는데
파이어베이스 데이터베이스 구조가
photos - uid1- 저장 시간1 - 제목:값
                                       - 내용 :값
                     - 저장 시간2
              uid2
              uid3

이런식으로 되어있습니다
질문자님이랑 똑같은 구조로 만들어놓고 제가 테스트 해보면 photos 밑의 모든 구조를 다 가지고 오고 child함수로 타고 들어가면서 모든 데이터가 조회 가능한데 정확히 어떤 부분이 안되신다는건지....
그니까 저는 리스트 뷰에 제목,내용 형식으로 나열시키고 싶은데 타이틀이란 변수에 한번에 다들어가니까 그 데이터를 분류하고 싶어요.. 제목은 제목대로.내용은 내용대로 그러려면 uid별로 다 분류하고 그 uid안에 시간별로 다 분류해야 될것 같은데 그 방법을 모르겠습니다..
꼭 제목은 제목대로 내용은 내용대로 분류해야 하나요?
그냥 아이템의 uid : 아이템 구조체 형식으로 저장하면 안되나요?

저는 왜 시간별로 분류가 필요하신건지 이해가 가지 않네요.

아래 그림처럼요
https://firebasestorage.googleapis.com/v0/b/fcmsample-22bf6.appspot.com/o/%EC%BA%A1%EC%B2%98.PNG?alt=media&token=5b444ee3-5275-41ee-a5f2-a151bc9322ae

그럼 질문자님처럼 photos 참조에 이벤트 꽂아가지고 아이템 별로 리스트뷰에 집어 넣으실수 있을거같은데...
https://firebasestorage.googleapis.com/v0/b/mentorch-6a6e1.appspot.com/o/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202017-02-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.22.19.png?alt=media&token=883e4b04-c7aa-49c8-a0e2-db8955d554bc
전 이런식으로 하고 싶은데.. 이래야 어떤 사용자가 언제 올렸는지까지 알수 있어서요
맨 위처럼 타이틀로 데이터를 받은다음에 제목 내용 사진 별로 분류하는 방법은 없나요??
제목 내용 사진 별로 분류 한다는게 특정 키워드로 쿼리를 말씀하시는건가요?
일반 관계형DB에서의 where 조건 같은거 말씀하시는거라면 그 기능은 firebase 데이터베이스 레퍼런스에 존재하지 않는 기능입니다.
아 그렇군요... 알려주셔서 감사합니다 ㅎㅎ
다른 방법을 찾아야겠네요 ㅠㅠ
...