콘텐츠 데이터 모델
데이터의 구조를 지키지 않고 마구잡이로 삽입한다면 나중에 관리하기 쉽지 않을 것이다.
그렇기 때문에 데이터에 대한 모델을 작성하여 데이터의 구조를 표준화해주는 작업이 필요하다.
navigation 패키지 안에 'model'이라는 패키지를 만들자. 그 후 contentDTO라는 코틀린 파일을 작성하자.
package com.example.firstapp.navigation.model
import java.sql.Timestamp
data class ContentDTO(var explain: String? = null, var imageUrl: String? = null,
var uid: String? = null, var userId: String? = null,
var timestamp: Long? = null, var favoriteCount: Int = 0,
var favorite: Map<String, Boolean> = HashMap()){
data class Comment(var uid: String? = null, var userId: String? = null, var comment: String? = null, var timestamp: Long? = null)
}
explain, imageUrl, timestamp, userId 등의 값을 다루는 모델이다.
그런 다음 AddPhotoActivity에 토스트메세지만 전달했던 contentUpload 함수를 수정하자.
fun contentUpload() {
//make filename
var timestamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
var imageFileName = "IMAGE_" + timestamp + "_.png"
var addPhotoEditExplain = findViewById<EditText>(R.id.addPhoto_edit_explain)
var storageRef = storage?.reference?.child("image")?.child(imageFileName)
//promise
storageRef?.putFile(photoUri!!)?.continueWithTask { task: Task<UploadTask.TaskSnapshot> ->
return@continueWithTask storageRef.downloadUrl
}?.addOnSuccessListener{ uri ->
var contetnDTO = ContentDTO()
//Insert downloadUrl of image
contetnDTO.imageUrl = uri.toString()
//Insert uid of user
contetnDTO.uid = auth?.currentUser?.uid
//Insert userId
contetnDTO.userId = auth?.currentUser?.email
//Insert explain of content
contetnDTO.explain = addPhotoEditExplain.text.toString()
//Insert timestamp
contetnDTO.timestamp = System.currentTimeMillis()
firestore?.collection("images")?.document()?.set(contetnDTO)
setResult(Activity.RESULT_OK)
finish()
}
}
대부분 동일하지만 storageRef에서 데이터를 삽입할 때 promise를 사용하게 바꾸었다.
이는 안드로이드에서 권장하는 방법이다.
contetnDTO에 알맞는 데이터를 설정한 뒤 수행하는 구문이다.
테스트해보자.