Development/Android
Class Model does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.
Jamie
2023. 6. 29. 09:54
반응형
안녕하세요. Jamie입니다.
오늘은 제가 Firebase RealtimeDatabase의 데이터를 가져온 과정에서 발생한 에러의 해결 방법을 공유합니다.
Firebase RealtimeDatabase에는 아래와 같은 모델 데이터가 있습니다.
{a="abc", b="def", c="ghi", d="jkl"}
이것을 data class로 정의하여 파이어베이스에서 얻어오려고 다음과 같은 코드를 작성합니다.
data class TestModel(
val a: String,
val b: String,
val c: String,
val d: String
)
Coroutine + ViewModel을 사용하여 Firebase RealtimeDatabase에서 데이터를 가져옵니다.
suspend fun requestDataList(type: String, version: String) {
Logger.d("requestDataList called. type: $type, version: $version")
return withContext(Dispatchers.IO) {
val database = Firebase.database(FirebaseConstants.BASE_URL)
val databaseReference = database.getReference(type)
databaseReference.child(version).addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
try {
Logger.d("onDataChange called.")
val dataList: List<TestModel> = ArrayList()
for (value in snapshot.children) {
value.getValue(TestModel::class.java)?.let { model ->
}
}
playerLiveData.postValue(dataList)
} catch (e: Exception) {
Logger.e("Occur Exception. message: ${e.message}")
playerLiveData.postValue(null)
}
}
override fun onCancelled(error: DatabaseError) {
Logger.e("onCancelled called.")
playerLiveData.postValue(null)
}
})
}
}
이때 정상적으로 viewModel에 postValue가 되지 않고, catch에 다음과 같은 메시지를 확인할 수 있었습니다.
Occur Exception. message: Class com.test.models.TestModel does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.
문제점을 해결하기 위해 찾아본 결과, 아래와 같이 data class에 초기값을 지정해주면 된다고 합니다.
data class TestModel(
val a: String = "",
val b: String = "",
val c: String = "",
val d: String = ""
)
프로가드 사용시, 생성자 관련 문제와 예외조건을 줘야하는데, 이 부분과 관련이 있어보이는데, 추후에 왜 이렇게 해야하는지 추가하도록 하겠습니다.
참고 사이트
반응형