inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

댓글 불러오기 파트 진행 중인데 앱이 다운되네요 ㅠㅠ

621

장우준

작성한 질문수 8

0

댓글 불러오기 부분 하고 있는데

2022-09-18 18:50:08.110 7539-7539/com.example.mysololife E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.example.mysololife, PID: 7539

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.mysololife.comment.CommentModel

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)

at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)

at com.example.mysololife.board.BoardInsideActivity$getCommentData$postListener$1.onDataChange(BoardInsideActivity.kt:77)

at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)

at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)

at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)

at android.os.Handler.handleCallback(Handler.java:942)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loopOnce(Looper.java:201)

at android.os.Looper.loop(Looper.java:288)

at android.app.ActivityThread.main(ActivityThread.java:7898)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

 

이러한 오류 메시지 뜨면서 앱이 죽습니다

 

코드는 board inside 부분은

 

package com.example.mysololife.board

import android.content.Intent
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.core.view.isVisible
import androidx.databinding.DataBindingUtil
import com.bumptech.glide.Glide
import com.example.mysololife.R
import com.example.mysololife.comment.CommentLVAdapter
import com.example.mysololife.comment.CommentModel
import com.example.mysololife.databinding.ActivityBoardInsideBinding
import com.example.mysololife.utils.FBAuth
import com.example.mysololife.utils.FBRef
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 java.lang.Exception

class BoardInsideActivity : AppCompatActivity() {
    private val commentDataList = mutableListOf<CommentModel>()

    private lateinit var binding : ActivityBoardInsideBinding

    private lateinit var key : String

    private lateinit var commentAdapter : CommentLVAdapter


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_board_inside)

//        val title = intent.getStringExtra("title").toString()
//        val content = intent.getStringExtra("content").toString()
//        val time = intent.getStringExtra("time").toString()

//        binding.titleArea.text = title
//        binding.textArea.text = content
//        binding.timeArea.text = time

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

        binding.boardSetting.setOnClickListener {
            showDialog()
        }

        binding.commentBtn.setOnClickListener {
            insertComment(key)
        }


        getCommentData(key)

        commentAdapter = CommentLVAdapter(commentDataList)
        binding.commentLV.adapter = commentAdapter
    }

    fun getCommentData(key: String){
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                commentDataList.clear()

                for (dataModel in dataSnapshot.children) {

                    val item = dataModel.getValue(CommentModel::class.java)
                    commentDataList.add(item!!)
                }
                commentAdapter.notifyDataSetChanged()
            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w("TalkFragment", "loadPost:onCancelled", databaseError.toException())
            }
        }
        FBRef.commentRef.child(key).addValueEventListener(postListener)
    }

    fun insertComment(key: String){
        FBRef.commentRef
            .child(key)
            .push()
            .setValue(CommentModel(
                binding.commentArea.text.toString(),
                FBAuth.getTime()
            )
            )

        Toast.makeText(this,"댓글 입력 완료",Toast.LENGTH_LONG).show()
        binding.commentArea.setText("")
    }

    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 {
            val intent = Intent(this,BoardEditActivity::class.java)
            intent.putExtra("key",key)
            startActivity(intent)
        }
        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){

        val storageReference = Firebase.storage.reference.child(key)



        val imageViewFB = binding.getImageArea

        storageReference.downloadUrl.addOnCompleteListener(OnCompleteListener { task ->
            if (task.isSuccessful) {
                Glide.with(this)
                    .load(task.result)
                    .into(imageViewFB)
            }
            else {
                binding.getImageArea.isVisible = false
            }
        })

    }

    private fun getBoardData(key: String){
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

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

                    binding.titleArea.text = dataModel!!.title
                    binding.textArea.text = dataModel!!.content
                    binding.timeArea.text = dataModel!!.time

                    val myUid = FBAuth.getUid()
                    val writeUid = dataModel.uid

                    if (myUid == writeUid){
                        binding.boardSetting.isVisible = true
                    }
                    else {

                    }


                }
                catch (e: Exception){

                }



            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w("TalkFragment", "loadPost:onCancelled", databaseError.toException())
            }
        }
        FBRef.boardRef.child(key).addValueEventListener(postListener)
    }
}

 

이렇게 짰습니다 오류메세지가 가르키는 부분이

    for (dataModel in dataSnapshot.children) {

    이쪽-->    val item = dataModel.getValue(CommentModel::class.java)
        commentDataList.add(item!!)
    }
    commentAdapter.notifyDataSetChanged()
}

이던데 뭐가 문제일까요?

 

추가로 commentLVAdapter는

package com.example.mysololife.comment

import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.LinearLayout
import android.widget.TextView
import com.example.mysololife.R
import com.example.mysololife.utils.FBAuth

class CommentLVAdapter(val commentList : MutableList<CommentModel>) : BaseAdapter () {
    override fun getCount(): Int {
        return commentList.size
    }

    override fun getItem(p0: Int): Any {
        return commentList[p0]
    }

    override fun getItemId(p0: Int): Long {
        return p0.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        var view = convertView

        if (view == null) {
            view = LayoutInflater.from(parent?.context)
                .inflate(R.layout.board_list_item, parent, false)
        }
        val title = view?.findViewById<TextView>(R.id.titleArea)

        val time = view?.findViewById<TextView>(R.id.timeArea)


        title!!.text = commentList[position].commentTitle
        time!!.text = commentList[position].commentCreatedTime

        return view!!
    }
}

이렇게 모델은

 

package com.example.mysololife.comment

data class CommentModel (
    val commentTitle : String = "",
    val commentCreatedTime : String = ""
)

이렇게 했습니다

 

kotlin firebase android

답변 1

0

개복치개발자

말씀주신 것 처럼

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.mysololife.comment.CommentModel

    이쪽-->    val item = dataModel.getValue(CommentModel::class.java)
        commentDataList.add(item!!)
    }

이쪽 이라는 곳에 데이터를 불러오는 타입이 CommentModel의 형태로 안들어가는거 같은데

dataModel.toString() 으로 데이터를 하나씩 확인해보시겠어요?

 

이미지가 기본이미지인지 확인

0

143

1

NavController error 발생

0

156

1

fragment 생성하고 메인에서 불러왔는데 안뜹니다.

0

151

2

67강 댓글

0

113

2

7강 데이터바인딩 에러

0

129

2

Firebase 스토리지 유료화 문제

1

309

2

게시글 이미지가 파이어베이스에 저장되지 않습니다.

0

192

2

AVD 갤러리에 이미지 저장 안되는 문제

0

257

2

이미지 받아오는 방법?

0

213

2

회원탈퇴 기능을 추가하려고 합니다.

0

199

2

상태바 질문 드립니다.

0

120

1

섹션2 인트로 페이지 꾸미기 질문 드립니다.

0

124

1

게시판 글을 길게 쓸경우

0

131

2

로그인 로그아웃

0

188

2

갤럭시 연결시 게시판에 업로드한 사진이 보이지 않아요.

0

223

2

웹뷰 AVD 실행안됨

0

201

1

자막켜기가 안되요 ㅜ.ㅜ

1

199

1

리사이클러뷰, 그리드레이아웃 오류

0

194

2

리사이클러뷰 오류 해결 방법이 궁금합니다.

0

205

1

firebase 스마트폰으로 연결이 안되는데 원인이 있을까요

0

275

2

안드로이드 스튜디오 게시글 이미지 업로드 유무

0

231

1

firebase 설정 오류

0

312

2

홈 화면 커뮤니티

0

183

1

게시판 글 읽기

0

247

2