인프런) 앱 8개를 만들면서 배우는 안드로이드 코틀린

섹션 6. 다이어트 메모 앱 만들기(5) - 파이어베이스 리얼타임 데이터베이스(Realtime Database) 저장하기

농농씨 2023. 9. 10. 20:05

지난 글까지는 스플래시화면을 만들고, 메모와 리스트뷰로 이루어진 레이아웃을 작성한 다음, 글쓰기 버튼을 누르면 날짜를 선택하는 다이얼로그를 띄우는 것을 학습했다.

 

이번 글에서는 입력한 메모를 데이터 베이스에 저장하고, 불러오는 것을 해볼 것이다.

 

그 전에, 날짜를 선택했으니 '저장하기' 버튼을 만들어줄 것이다.

다이얼로그의 레이아웃 파일로 가서 다음과 같이 버튼을 만들어준다.

 

이제 데이터 저장 기능을 만들어주자.

메인액티비티로 가서, 이전에 만들었던 DateSelectBtn의 setOnClickListener 함수 영역이 끝나는 부분부터 빠져나와서 작성해주자.

이렇게 findViewById로 뷰 객체 만들어주고 setOnClickListener 함수를 만들어주자.

 

이제 파이어베이스로 가서 Realtime Database 기능을 클릭해주자.

데이터 베이스 만들기 클릭-데이터베이스위치 설정(미국)

데이터베이스 설정(테스트 모드에서 시작) 까지 완료하면 데이터베이스가 저장되는 곳이 나온다.

 

이제 데이터베이스를 어떻게 사용하는지 구글링을 해보자.

 

파이어베이스에서 제공하는 가이드를 따라가보자.

 

왼쪽더보기 누르고 Android-시작하기 클릭 후 나오는 화면을 따라 추가하란 거 추가해주면 된다.

먼저 이전 Android 프로젝트에 Firebase를 추가해줘야 한다.

이전 글에 써놨으니 참고 바란다. 프로젝트 생성한것에 안드로이드 아이콘 누르고 패키지 이름 입력하고 다운받으란 파일 src 폴더에 넣어주고 그래들 파일에 추가하란거 추가해주면 끝이다.

 

다시 돌아와서,

앱에 실시간 데이터베이스 SDK 추가

그래들파일에 추가해주기.(윗줄은 파이어베이스에 앱 등록하면서 이미 넣어놓은 부분)

 

데이터베이스에 쓰기

복사한 부분을 saveBtn을 누르면 실행될 이벤트 영역에 붙여넣기 해줌. 그래들 Sync Now 하고 나서 해주는 것 잊지 말기.

 

<오류노트

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

 

널포인트 예외가 발생했나 하고 이것저것 다 해봤는데 구글링해보니 나랑 똑같은 다이얼로그에서의 오류가 있었다.

참고자료: https://krapoi.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-javalangNullPointerException-Attempt-to-invoke-virtual-method-void-androidwidgetButtonsetOnClickListenerandroidviewViewOnClickListener-on-a-null-object-reference

 

button을 가져올 때 그냥 findViewById 를 사용했기 때문이라고 한다.

선택된 부분과 같이 dialog를 따로 만들고( Dialog는 임포트 해주고) 그 dialog에서 findViewById를 사용해봤다.

 

근데 이번에는 saveBtn의 클릭함수가 클릭되어도 아무 일이 일어나지 않고 데이터도 저장되지 않았다.

알고보니 아까 글쓰기 버튼을 클릭하면 다이얼로그 창이 뜨게 할 때 mDialogView라는 이름으로 다이얼로그 뷰 객체를 이미 만들어놓은 것이었다.

그래서 saveBtn의 뷰 바인딩을 mDialogView.findViewById로 다시 해줬더니 토스트 메시지로도, 로그로도 saveBtn이 잘 클릭됨을 확인할 수 있었다.

토스트메시지도 잘 뜬다.

오류해결~ />

 

코드 수정 후에 저장버튼을 눌러주면 데이터가 저장된다.

그런데 저장버튼을 여러번 눌러도 이미 저장된 데이터가 똑같으면 Hello, World 라는 문구가 더 추가되지는 않는다.

그래서 데이터를 '계속' 넣어주려면

myRef.push().setValue("Hello, World!")처럼 push() 를 넣어주면 된다.

데이터가 여러개 저장된것을 확인할 수 있다.

 

이제 날짜데이터와 메모데이터를 데이터베이스에 넣어주자.

우선 날짜 데이터와 메모데이터를 변수화 하자.

빈 변수를 만들어주고 날짜선택한 다음의 이벤트 안에서 그 변수에 선택한 날짜를 집어넣는다.

 

EditText 뷰에 아이디 달아주고, 저장하기 버튼의 클릭함수에서 findViewById로 가져온다.

이때 text를 String으로 가져와야 한다.

 

이제 이 값들을 데이터베이스에 저장해야 하는데,

저장할 데이터값이 두개 이상이므로 데이터를 담는 그릇인 데이터모델을 만들어야 한다.

 

데이터모델만들기

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

그냥 class 가 아닌 data class 로 만들어주고 입력할 값을 두개 만들어준다.

이때 괄호모양은 반드시 소괄호() 여야 한다!

 

데이터그릇을 다 만들었으므로 데이터를 저장해주도록 하자.

model 이라는 변수에 데이터 타입이 아까 만든 DataModel인 데이터를 저장해주자.

그 안에는 날짜데이터와 메모데이터가 들어간다.

 

myRef의 getReference 도 memory 에서 myMemo로 임의로 변경해주자.

 

실행하고 날짜선택, 메모입력, 저장하기 버튼 누르면

데이터가 잘 저장된 것을 확인할 수 있다.

 

다음 글에서는 이렇게 저장한 데이터베이스를 불러오는 것을 해보겠다.