본문 바로가기
카테고리 없음

섹션 6. 다이어트 메모 앱 만들기(6)-데이터 불러오기

by 농농씨 2023. 9. 10.

지난 글까지 스플래시 만들기, 다이얼로그 화면 만들고 데이터 저장하기 등을 했다.

이번에는 저장한 데이터를 불러올 것이다.

 

먼저 데이터 저장 버튼을 눌렀을 때 다이얼로그가 닫히도록 하려면

dismiss라는 위와 같은 코드를 추가하면 된다.

 

실행해보면 저장하기 눌렀을 때 잘 닫힌다.

 

우선 앱이 실행되었을 때 리스트뷰에 모든 데이터가 나와야 하므로 데이터를 가져오는 것을 해보자.

이전 글에서 데이터 저장하기 구문에서 레퍼런스의 주소(29~30 line)를 OnCreate로 가져온다.

 

그 다음 myRef 라는 레퍼런스에서 데이터를 찾아오는 구문을 작성한다.(32 line)

myref.addValueEventListener(object : ValueEventListener{})

여기까지 작성하면 object에 빨간불이 뜨면서 필요한 member들을 import하라고 할것이므로 alt+enter를 눌러서 임포트 해준다.

 

임포트하면 그 안에 두 함수가 선언되는데

첫번째 함수는 데이터가 변경되었을 때 호출된다.

매개변수인 snapshot은 모든 데이터를 가져오는데, for 반복문을 통해 snapshot에 있는 데이터들을 하나하나 가져오고, 로그로 그 값을 출력한다.

 

실행해보면 저장된 데이터가 잘 불러와지는 것을 로그로 확인할 수 있다.

 

이제 가져온 데이터를 리스트뷰에 넣어주자.

리스트뷰 복습: 

<필요한 연결들>

1️⃣ 메인액티비티-어댑터

2️⃣ 어댑터-아이템레이아웃

3️⃣ 아이템레이아웃-메인레이아웃의 리스트뷰

어댑터를 만들어서 아이템레이아웃과 연결한 다음, 리스트를 어댑터에 넣어준다.

어댑터에서 아이템레이아웃에 아이템을 하나하나 넣어준다.

메인 레이아웃의 리스트뷰 영역에서 그 아이템레이아웃을 출력한다.

 

우선 메인액티비티에서 리스트뷰 객체를 findViewById로 생성하자.

 

이제 어댑터를 만들어주자

어댑터 만들기: 소스파일들어있는 디렉터리 우클릭-New-Kotlin Class/File

 

어댑터는 이전 글에서 만든 DataModel 타입의 데이터를 인수로 받을 것이다.

class ListViewAdapter(val List : MutableList<DataModel>) : BaseAdapter() {}

여기까지만 입력하면 빨간줄이 뜬다. alt+enter 눌러서 필요한 멤버 import 해주면 된다.

그러면 다음과 같이 뜬다.

어댑터를 만들었으므로 아이템레이아웃을 만들고 디자인해주자.

레이아웃 만들기: layout 디렉터리 우클릭-New-Layout Resource File

이름은 listview_item

 

위와같이 꾸며주자.

 

이제 어댑터를 꾸며주자.

어댑터에서 아이템레이아웃에 리스트의 아이템을 하나하나 넣어주는 것까지 했다. (2️⃣번 연결)

 

이제 메인액티비티에서 어댑터에 리스트뷰를 연결해주자 (1️⃣번연결)

주석이 어지러우므로 짚는 곳만 보자.

 

onCreate 밖에 리스트를 만들어주고(26번 line)

내가 만든 어댑터 파일에, 그 리스트를 인수로 전달한 것을, 변수로 객체화하자.(37번 line)

그리고 snapshot으로 데이터를 불러온 것을 리스트뷰에 저장하자.(51번 line)

로그로 리스트에 데이터가 잘 저장되었는지 출력하자.(54번 line)

 

로그에 DataModel 태그로 리스트에 데이터가 잘 저장된 것을 확인할 수 있다.

 

이제 리스트뷰(listView)에 내가 만든 어댑터(아래 사진의 adapter_list)를 연결해주자.(3️⃣번 연결)

* 헷갈리니까 adapter->adapter_list로 이름 변경

 

실행해보면 아무것도 안나온다.

복습>>> "비동기"

 

어댑터에 데이터 넣고(line 37)

리스트뷰가 생성된 다음(line 39)

그 다음에 리스트에에 DataModel 값이 들어가는 중이다.(line 51)

한마디로 어댑터가 만들어진 다음에 리스트에 데이터가 들어가서 빈 리스트가 출력되는 것이다.

 

따라서 리스트에 DataModel 다 들어가고 나면 어댑터를 새롭게 만들어줘야 한다.

위와 같이 추가해주고 실행해보면

 

데이터가 잘 나오는 것을 확인할 수 있다.(첫번째 사진)

 

그런데 데이터를 추가해보면 리스트에 다시 처음부터 데이터가 추가돼서 중복된다.

세번째사진과 같이 list를 clear 해주는 구문을 넣으면

두번째사진과 같이 추가한 데이터 하나만 추가된다.

 

이제 '내가 저장한 데이터만 보이도록' 할 것이다.(authentication, 인증)

 

먼저 구글에서인증 기능을 추가해주자.

구글링해서 firebase login이라고 검색하면 나오는 가이드라인을 따라가준다.

잘 모르겠으니 왼쪽 더보기를 누르면 나오는 Android-시작하기를 눌러준다.

 

앱 수준 Gradle 파일에

위와 같이 77번 line을 추가해준다. 인증기능을 사용하겠다는 의미이다.

 

좌측 더보기 눌러서 '익명인증'을 클릭하고 그래들파일에 auth 선언되어있는지 확인하고

위의 사진들의 1번, 3번 코드를 복붙해준다(2번은 없어도 된다.)

추가된 부분: 28, 37, 39~52 line

 

다시 돌아와서, 내가 저장한 데이터만 보이게 하려면,

데이터베이스에 데이터를 넣을 때 경로를 추가해준다.

그러면 다음과 같이 데이터는 저장되지만 보이지 않는다.

오른쪽 사진처럼 내 uid에 따라 데이터가 별도로 저장된 것을 볼 수 있다.

 

이제 데이터를 불러올 때도 내 uid 기반으로 데이터를 불러와야 한다.

그러므로 데이터를 불러오는 코드에도 경로를 추가해준다.

이렇게 child를 이용해 현재 이용자의 uid에 기반한 데이터만 불러오도록 하면

저장한 데이터도 잘 보이고 새로운 데이터도 잘 추가되는 것을 확인할 수 있다.

 

앞으로도 공부하다가 뭔가 문제가 생기면 줄마다 로그를 찍어보면서 어디서부터 뭐가 잘못됐는지 확인하는 습관을 들이는 것이 좋다.