인프런 커뮤니티 질문&답변

신예리님의 프로필 이미지
신예리

작성한 질문수

[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)

게시글 삭제 만들기

게시글 삭제시 에러 문의드립니다

해결된 질문

작성

·

533

1

안녕하세요 선생님, 잦은 질문 죄송합니다ㅠㅠ 현재 안드로이드 코틀린 커뮤니티앱 강의 중 게시글 삭제 만들기까지 진행한 상황입니다.

게시글 삭제를 클릭해도 화면과 파이어베이스에 해당 글이 그대로 남아있는 문제가 발생해 질문드립니다(앱이 죽지는 않고, 로그에 에러 메시지도 찍히지 않습니다).

https://github.com/shinyelee/my-solo-life

혹시몰라 리얼타임DB, 스토리지 규칙도 캡처했습니다.

답변 1

0

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요 예리님

이전에 만들어놓은 Firebase를 최근 작업중이신 것 같네요

마찬가지로 이렇게 true로 변경해보시겠어요?

신예리님의 프로필 이미지
신예리
질문자

FB 규칙 변경 후 에뮬레이터 데이터 지우고 다시 삭제 시도했는데 똑같습니다. 여전히 게시글이 남아있고, 앱도 살아있고, 로그에 뭐 뜨는 것도 없습니다.

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

작성하신 코드를 공유해주시겠어요?

신예리님의 프로필 이미지
신예리
질문자

// 전체 코드는 깃허브에 있고 -> https://github.com/shinyelee/my-solo-life

// 아래는 BoardInsideActivity 코드입니다

 

package com.shinyelee.my_solo_life.board

 

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import android.util.Log

import android.view.LayoutInflater

import android.widget.Button

import android.widget.Toast

import androidx.appcompat.app.AlertDialog

import androidx.databinding.DataBindingUtil

import com.bumptech.glide.Glide

import com.google.android.gms.tasks.OnCompleteListener

import com.google.firebase.database.DataSnapshot

import com.google.firebase.database.DatabaseError

import com.google.firebase.database.ValueEventListener

import com.google.firebase.ktx.Firebase

import com.google.firebase.storage.ktx.storage

import com.shinyelee.my_solo_life.R

import com.shinyelee.my_solo_life.databinding.ActivityBoardInsideBinding

import com.shinyelee.my_solo_life.utils.FBRef

import java.lang.Exception

 

class BoardInsideActivity : AppCompatActivity() {

 

    private val TAG = BoardInsideActivity::class.java.simpleName

 

    private lateinit var binding : ActivityBoardInsideBinding

 

    private lateinit var key : String

 

    override fun onCreate(savedInstanceState: Bundle?) {

 

        super.onCreate(savedInstanceState)

 

        binding = DataBindingUtil.setContentView(this, R.layout.activity_board_inside)

 

        binding.boardSettingIcon.setOnClickListener {

            showDialog()

        }

 

        val key = intent.getStringExtra("key").toString()

        getBoardData(key)

        getImageData(key)

 

    }

 

    private fun showDialog() {

 

        val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null)

 

        val mBuilder = AlertDialog.Builder(this)

            .setView(mDialogView)

            .setTitle("게시글 수정/삭제")

 

        val alertDialog = mBuilder.show()

 

        alertDialog.findViewById<Button>(R.id.editBtn)?.setOnClickListener {

            Toast.makeText(this, "글이 수정되었습니다", Toast.LENGTH_LONG).show()

        }

 

        alertDialog.findViewById<Button>(R.id.removeBtn)?.setOnClickListener {

            FBRef.boardRef.child(key).removeValue()

            Toast.makeText(this, "글이 삭제되었습니다", Toast.LENGTH_LONG).show()

            finish()

        }

 

    }

 

    private fun getImageData(key : String) {

 

        // Reference to an image file in Cloud Storage

        val storageReference = Firebase.storage.reference.child(key + ".png")

 

        // ImageView in your Activity

        val imageViewFromFB = binding.getImageArea

 

        storageReference.downloadUrl.addOnCompleteListener(OnCompleteListener { task ->

            if(task.isSuccessful) {

                Glide.with(this)

                    .load(task.result)

                    .into(imageViewFromFB)

            } else {

 

            }

        })

 

    }

 

    private fun getBoardData(key : String) {

 

        val postListener = object : ValueEventListener {

 

            override fun onDataChange(dataSnapshot: DataSnapshot) {

 

                try {

 

                    val dataModel = dataSnapshot.getValue(BoardModel::class.java)

//                Log.d(TAG, dataModel!!.title)

 

                    binding.titleArea.text = dataModel!!.title

                    binding.textArea.text = dataModel!!.contents

                    binding.timeArea.text = dataModel!!.time

 

                } catch (e : Exception) {

 

                    Log.d(TAG, "글이 삭제되었습니다")

 

                }

 

            }

 

            override fun onCancelled(databaseError: DatabaseError) {

                // Getting Post failed, log a message

                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())

            }

 

        }

        FBRef.boardRef.child(key).addValueEventListener(postListener)

 

    }

 

}

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

boardInsideActivity에서 

 

private lateinit var key : String

 

여기 lateinit key이라고 만들어놓은것을

 

private fun showDialog() {

val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null)

val mBuilder = AlertDialog.Builder(this)
.setView(mDialogView)
.setTitle("게시글 수정/삭제")

val alertDialog = mBuilder.show()

alertDialog.findViewById<Button>(R.id.editBtn)?.setOnClickListener {
Toast.makeText(this, "글이 수정되었습니다", Toast.LENGTH_LONG).show()
Log.d("LOG Key", key)
}

alertDialog.findViewById<Button>(R.id.removeBtn)?.setOnClickListener {

Log.d("LOG Key", key)

FBRef.boardRef.child(key).removeValue()
Toast.makeText(this, "글이 삭제되었습니다", Toast.LENGTH_LONG).show()
finish()
}

}

 

showDialog에서 사용하는데

 

저 key에 값이 들어가지 않았습니다.

 

아래 부분을

val key = intent.getStringExtra("key").toString()

 

이렇게 변경해보세요.

key = intent.getStringExtra("key").toString()

 

 

 

 

신예리님의 프로필 이미지
신예리
질문자

이제 잘 작동하네요 감사합니다!

신예리님의 프로필 이미지
신예리

작성한 질문수

질문하기