hyeals study
인스타그램 클론 (데이터 모델) 본문
- 이전에 업로드했던 사진을 체계적으로 데이터로 관리할 수 있는 데이터 모델 만들기
[1] build.gradle(Module:app)에 있는 dependencies에 아래와 같이 코드 추가
[2] navigation에 model이라는 새로운 패키지 생성
- 그 안에 ContentDTO라는 코틀린 클래스 파일 생성
[3] ContentDTO.kt 에 아래와 같이 코드를 작성함
package com.example.hyealsinstargram.navigation.model
import java.util.HashMap
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 favorites: 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: 이미지 주소를 관리하는 변수
- uid: 어느 유저가 이미지를 올렸는지 관리하는 변수
- userId: 컨텐츠를 올린 유저의 이미지를 관리해주는 변수
- timestamp: 컨텐츠를 올린 시간을 관리하는 변수
- favoriteCount: '좋아요' 갯수를 관리하는 변수
- favorites: '중복 좋아요를 방지'하기 위해 좋아요를 누른 유저를 관리하는 변수 ( Map → MutableMap 으로 변경)
- Comment: 댓글 관리해주는 데이터 클래스
- uid: 위와 동일
- userId: 유저의 이메일을 관리해주는 변수
- comment: 커멘트를 관리해주는 변수
- timestamp: 커멘트를 올린 시간을 관리해주는 변수
[4] AddPhotoActivity.kt
- 유저 정보를 가져올 수 있도록 아래와 같이 변수를 선언함
* var firestore: FirebaseFirestore? = null 부분: 데이터 베이스를 사용하기 위한 코드
- 이 부분을 초기화 해줌 (Oncreate 메소드 안에서 초기화)
- contentUpload 함수 안에 데이터베이스를 입력해주는 코드를 작성함
fun contentUpload(){
// Make filename
var timestamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
var imageFileName = "IMAGE_" + timestamp + "_.png"
// Callback method
var storageRef = storage?.reference?.child("images")?.child(imageFileName)
storageRef?.putFile(photoUri!!)?.addOnSuccessListener {
storageRef.downloadUrl.addOnSuccessListener { uri ->
var contentDTO = ContentDTO()
// Insert downloadUrl of image
contentDTO.imageUrl = uri.toString()
// Insert uid of user
contentDTO.uid = auth?.currentUser?.uid
// Insert userId
contentDTO.userId = auth?.currentUser?.email
// Insert explain of content
contentDTO.explain = addphoto_edit_explain.text.toString()
// Insert timestamp
contentDTO.timestamp = System.currentTimeMillis()
firestore?.collection("images")?.document()?.set(contentDTO)
setResult(Activity.RESULT_OK)
finish()
}
}
}
[코드 설명]
: 이미지 업로드가 완료되면 이미지 주소를 받아오는 코드
: 이미지 주소를 받아오자마자 데이터 모델을 만들어주는 부분
: contentDTO에 데이터 값을 넣어주는 부분
- setResult(Activity.RESULT_OK): 업로드가 완료되면 finish()로 창을 닫아주고, 정상적으로 창이 닫혔다는 플래그 값을 넘겨주기 위한 부분
* 업로드 방식에는 Callback 방식과 Promise 방식이 있음 (앞서 작성한 코드는 Callback 방식)
◎ Promise 방식
storageRef?.putFile(photoUri!!)?.continueWithTask { task: com.google.android.gms.tasks.Task<UploadTask.TaskSnapshot> ->
return@continueWithTask storageRef.downloadUrl
}?.addOnSuccessListener { uri ->
var contentDTO = ContentDTO()
// Insert downloadUrl of image
contentDTO.imageUrl = uri.toString()
// Insert uid of user
contentDTO.uid = auth?.currentUser?.uid
// Insert userId
contentDTO.userId = auth?.currentUser?.email
// Insert explain of content
contentDTO.explain = addphoto_edit_explain.text.toString()
// Insert timestamp
contentDTO.timestamp = System.currentTimeMillis()
firestore?.collection("images")?.document()?.set(contentDTO)
setResult(Activity.RESULT_OK)
finish()
}
[5] firebase에서 데이터베이스를 설정함
- 데이터베이스 규칙에 아래와 같이 코드를 작성함
- 프로젝트를 실행시켜서 사진을 업로드하면 아래와 같이 데이터베이스에 정보가 입력되어있음
'안드로이드' 카테고리의 다른 글
인스타그램 클론 (좋아요 버튼) (0) | 2020.04.06 |
---|---|
인스타그램 클론 (상세화면 페이지) (0) | 2020.04.06 |
인스타그램 클론 (사진 업로드) (0) | 2020.04.01 |
인스타그램 클론 (메인 화면) (0) | 2020.03.31 |
인스타그램 클론 (페이스북 로그인) (1) | 2020.03.31 |