Ссылка на базу данных Firebase не возвращает обновленный dataSnapshot после вставки новых данных - PullRequest
0 голосов
/ 17 апреля 2019

Я интегрировал базу данных Firebase Realtime в свой проект. Когда в это время активность открыта, я проверяю, что пользователь уже зарегистрирован в базе данных или нет, и для этого я вызываю метод checkIsAlreadyCheckIn(empDataRef) из 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 , тогда он успешно вставит данные в базу данных fireabse, но после 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 является нулевым, и мы не можем преобразовать его в String.

Вопрос: Как обновить / получить данные после их вставки в базу данных и обратного вызова / триггера в addEventValueListener?

1 Ответ

2 голосов
/ 17 апреля 2019

toString() очень гибок в использовании - попробуйте следующее: -

isCheckIn = dataSnapshot.child(FirebaseKey.isCheckIn).value.toString()

PS: - Даже если его null - Это приведет - "null" (в виде строки),Затем вы можете добавить чек соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...