Firestore에 데이터를 저장하기 위해 데이터 클래스를 생성한다.
model이란 패키지를 하나 만들고, 그 안에 ContentDTO.kt 파일을 추가한다.
data class ContentDTO(var exaplain: String? = null, //게시글
var imageUrl: String? = null, //이미지 url
var uid: String? = null, //글 작성자 식별자
var userEmail: String? = null, //글 작성자 이메일
var timestamp: Long? = null, //작성일
var favoriteCount: Int = 0, //좋아요 수
var favorites: Map<String, Boolean> = HashMap()) { //좋아요를 누른 사람들
data class Comment(var uid: String? = null, //댓글 작성자 식별자
var userEmail: String? = null, //댓글 작성자 이메일
var comment: String? = null, //댓글
var timestamp: Long? = null) //댓글 작성일
}
위와 같이 데이터 클래스를 작성해준다.
build.gradle(module)에 firestore 사용을 위한 라이브러리를 설치한다.
dependencies {
implementation 'com.google.firebase:firebase-firestore-ktx'
}
class GalleryFragment(uri: Uri): Fragment() {
private lateinit var mBinding: FragmentGalleryBinding
private var uri: Uri = uri
private var auth: FirebaseAuth? = null
private var store: FirebaseFirestore? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mBinding = FragmentGalleryBinding.inflate(inflater, container, false)
//firebase 서비스 초기화
auth = FirebaseAuth.getInstance()
store = FirebaseFirestore.getInstance()
mBinding.postPhotoIV.setImageURI(uri) //갤러리에서 선택한 이미지를 해당 이미지뷰에서 보여줌.
//게시글 업로드 버튼을 누르면 Firebase Storage에 이미지를 업로드 하는 함수 실행.
mBinding.postButton.setOnClickListener {
uploadImageTOFirebase(uri!!)
}
return mBinding.root
}
}
store 변수에 FirebaseFirestore 클래스를 getInstance()를 통해 인스턴스를 생성하고, postButton(게시글 업로드 버튼)을 눌렀을 때 firestore에 데이터가 저장되는 uploadImageTOFirebase() 메서드를 호출한다.
//Firebase Storage에 이미지를 업로드 하는 함수.
fun uploadImageTOFirebase(uri: Uri) {
var storage: FirebaseStorage? = FirebaseStorage.getInstance() //FirebaseStorage 인스턴스 생성
//파일 이름 생성.
var fileName = "IMAGE_${SimpleDateFormat("yyyymmdd_HHmmss").format(Date())}_.png"
//파일 업로드, 다운로드, 삭제, 메타데이터 가져오기 또는 업데이트를 하기 위해 참조를 생성.
//참조는 클라우드 파일을 가리키는 포인터라고 할 수 있음.
var imagesRef = storage!!.reference.child("images/").child(fileName) //기본 참조 위치/images/${fileName}
//이미지 파일 업로드
imagesRef.putFile(uri!!).continueWithTask { task: Task<UploadTask.TaskSnapshot>->
//Firebase Storage에 업로드된 이미지의 downloadUrl을 리턴한다.
return@continueWithTask imagesRef.downloadUrl
}.addOnSuccessListener {
//ContentDTO 데이터 클래스 생성.
var contentDTO: ContentDTO = ContentDTO()
contentDTO.exaplain = mBinding.postTextView.text.toString()
contentDTO.imageUrl = it.toString()
contentDTO.uid = auth!!.currentUser!!.uid
contentDTO.userEmail = auth!!.currentUser!!.email
contentDTO.timestamp = System.currentTimeMillis()
//db에 데이터 저장.
store!!.collection("posts").document().set(contentDTO)
//저장 후 홈 프래그먼트로 이동.
(activity as MainActivity).changeFragment(HomeFragment())
(activity as MainActivity).changeNavigation()
}.addOnFailureListener {
println(it)
Toast.makeText(activity, getString(R.string.upload_fail), Toast.LENGTH_SHORT).show()
}
}
이미지 파일이 firebase storage에 성공적으로 업로드 되면(.addOnSuccessListener) ContentDTO 클래스를 생성해 데이터를 저장하고, store!!.collection("posts").document().set(contentDTO)
코드를 통해 posts라는 컬렉션에 contentDTO를 저장하고 HomeFragment로 이동한다. 만약 실패하면 토스트 메세지를 출력한다.