관리 메뉴

hyeals study

인스타그램 클론 (데이터 모델) 본문

안드로이드

인스타그램 클론 (데이터 모델)

hyeals 2020. 4. 5. 23:56

- 이전에 업로드했던 사진을 체계적으로 데이터로 관리할 수 있는 데이터 모델 만들기

 

[1] build.gradle(Module:app)에 있는 dependencies에 아래와 같이 코드 추가

 


[2] navigation에 model이라는 새로운 패키지 생성

 

model 패키지

- 그 안에 ContentDTO라는 코틀린 클래스 파일 생성

 

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: 댓글 관리해주는 데이터 클래스

  1. uid: 위와 동일
  2. userId: 유저의 이메일을 관리해주는 변수
  3. comment: 커멘트를 관리해주는 변수
  4. 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에서 데이터베이스를 설정함

 

- 데이터베이스 규칙에 아래와 같이 코드를 작성함

 


- 프로젝트를 실행시켜서 사진을 업로드하면 아래와 같이 데이터베이스에 정보가 입력되어있음

 

Comments