-
카테고리
-
세부 분야
모바일 앱 개발
-
해결 여부
미해결
댓글 불러오기 파트 진행 중인데 앱이 다운되네요 ㅠㅠ
22.09.18 18:53 작성 조회수 437
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 = ""
)
이렇게 했습니다
답변을 작성해보세요.
0
개복치개발자
지식공유자2022.09.19
말씀주신 것 처럼
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() 으로 데이터를 하나씩 확인해보시겠어요?
답변 1