#android #firebase #firebase-realtime-database #kotlin
# #Android #firebase #firebase-realtime-database #kotlin
Вопрос:
Я интегрировал базу данных Firebase в реальном времени в свой проект. Когда в это время открыто действие, я проверяю, зарегистрирован ли пользователь в базе данных или нет, и для этого я вызываю checkIsAlreadyCheckIn(empDataRef)
метод from onCreate()
. Проверьте приведенный ниже код.
class EmpProfileActivity : BaseActivity<EmpProfileActivityBinding, EmpViewModel>() {
private val timeSdf = SimpleDateFormat("hh:mm a", Locale.getDefault())
private val dateSdf = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
private lateinit var isCheckIn: String
private lateinit var checkInTime: String
private lateinit var checkOutTime: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mViewModel = EmpViewModel()
mBinding.empProfileViewModel = mViewModel
val empDataRef: DatabaseReference =
mDatabase!!.reference.child(FirebaseKey.NodeEmpCheckInOut)
.child(dateSdf.format(Date())).child(userSession!!.getUserId())
checkIsAlreadyCheckIn(empDataRef)
mBinding.txtCheckIn.setOnClickListener {
when (isCheckIn) {
"0" -> {
empDataRef.child(FirebaseKey.checkIn).setValue(timeSdf.format(Date()))
empDataRef.child(FirebaseKey.checkOut).setValue("")
empDataRef.child(FirebaseKey.todayDate).setValue(dateSdf.format(Date()))
empDataRef.child(FirebaseKey.isCheckIn).setValue("1")
}
else -> showAlert("Something went wrong, Please contact your admin")
}
}
}
private fun checkIsAlreadyCheckIn(empDataRef: DatabaseReference) {
empDataRef.addValueEventListener(object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {
Log.e("Error:", databaseError.message)
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
for(data:DataSnapshot in dataSnapshot.children){
//------------>aftet click that view error will come here
isCheckIn = dataSnapshot.child(FirebaseKey.isCheckIn).value as String
}
}
})
}
}
Когда я нажимаю на mBinding.txtCheckIn view, он успешно вставляет данные в fireabse DB, но после addValueEventListener
получения обратного вызова в checkIsAlreadyCheckIn()
методе и отправляет мне сообщение об ошибке ниже.
kotlin.TypeCastException: null cannot be cast to non-null type kotlin.String
at com.intro.ui.profile.EmpProfileActivity$checkIsAlreadyCheckIn$1.onDataChange(EmpProfileActivity.kt:124)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.1.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.1.0:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.1.0:55)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6165)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
Я проверил, что kotlin.Исключение TypeCastException: значение null не может быть приведено к ненулевому типу kotlin в документах kotlin, и я думаю, это означает, что значение DataSnapshot равно нулю, и мы не можем скрыть строку.
Вопрос: Как обновить / получить данные после их вставки в firebase и обратного вызова / запуска addEventValueListener
?
Ответ №1:
toString()
очень гибко в использовании — попробуйте следующее :-
isCheckIn = dataSnapshot.child(FirebaseKey.isCheckIn).value.toString()
P.S : — Даже если это null
— Это приведет — "null"
(как строка). Затем вы можете добавить соответствующую проверку.