중고거래 앱 만들기 (3) - 프래그먼트에서 FireBase 연결하기,실시간 데이터베이스 활용

2022. 12. 31. 21:45Android

  • build.gradle 모듈 추가

  •  다음은 안드로이드스튜디오에서 상단 Tools/Firebase 이렇게해서 추가하는방법도잇다.

실시간 데이터베이스 연동하기

                               

파이어베이스 앱 인증하기.
파이어베이스 스토리지(앱의 파일을 저장하는 기능)

 

implementation 'com.google.firebase:firebase-storage-ktx:20.1.0'
implementation platform('com.google.firebase:firebase-bom:31.1.1')
implementation 'com.google.firebase:firebase-auth-ktx:21.1.0'
implementation 'com.google.firebase:firebase-database-ktx:20.1.0'
  • 홈프래그먼트 
  //파이어베이스 연동하기
    private val auth: FirebaseAuth by lazy {
        Firebase.auth
    }

먼저 파이어베이스 auth를 선언 및 지연 초기화를 해줍니다.

지연초기화를 해주면 실제 사용이 되는 시점에 초기화를 시켜줍니다.

 

  • 파이어베이스 객체자체를 넘겨주고 받는다는 가정을 사용했다.
private val articleList = mutableListOf<ArticleModel>()
private val listener = object : ChildEventListener {
    override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
        //DB에 article 이 추가될때마다 동작하는 리스너
        //article 자체를 객체를 통해서 주고받음
        val articleModel = snapshot.getValue(ArticleModel::class.java)
         //null시 반환
        articleModel ?: return
        articleList.add(articleModel)
        articleAdapter.submitList(articleList)
    }
    override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {
    }
    override fun onChildRemoved(snapshot: DataSnapshot) {
    }
    override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {
    }
    override fun onCancelled(error: DatabaseError) {
    }
  • 대신 모델에는 컨스트럭트를 통해 기본 생성자를 만들어줘야만 연결이가능하다.
package com.example.secondhandtrade.home

import android.icu.text.CaseMap.Title
import android.net.Uri

data class ArticleModel (
   val sellerId: String,
   val title: String,
   val createdAt : Long,
   val price: String,
   val imageUri: String
        ) {
   constructor() : this("", "",0,"","")
}
  • 파이어베이스 데이터베이스 읽기 쓰기
  • 우선 저장은 파이어베이스 실시간 데이터베이스 에 앱이 직접 저장을 한다기보다는 인텐트와 유사하게
  • 데이터베이스 래퍼런스를 매개체 삼아 저장하고 읽어오는 방식입니다. 
//파이어베이스 연동하기
private val auth: FirebaseAuth by lazy {
    Firebase.auth
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val fragmentHomeBinding = FragmentHomeBinding.bind(view)
    binding = fragmentHomeBinding

    articleDB = Firebase.database.reference.child(DB_ARTICLES)
    articleAdapter = ArticleAdapter()
    
    fragmentHomeBinding.articleRecyclerView.layoutManager = LinearLayoutManager(context)
    fragmentHomeBinding.articleRecyclerView.adapter = articleAdapter

    articleDB.addChildEventListener(listener)
  • 프래그먼트 생명주기 활용
  • 생명주기를 활용하여 매뉴가변경되었다가 다시 돌아올 경우 다시 그려주도록 노티파이를 적용
  • 그리고 DeStroyview시 이벤트 리스너를 제거해주고 다시 생성될때 새로 할당되도록 해줍니다.
@SuppressLint("NotifyDataSetChanged")
override fun onResume() {
    super.onResume()
    //view를 다시 그림.
  articleAdapter.notifyDataSetChanged()
}
override fun onDestroyView() {
    super.onDestroyView()
    articleDB.removeEventListener(listener)
}
  • 실시간 데이터베이스

  • 애뮬레이터 실행화면

이렇게 Firebas에서 상품 목록 가져와 보여주고있다,