ValueEventListener被分配到正确的路径,但它没有读取子节点的值,但返回右键

时间:2018-03-07 12:07:40

标签: android firebase firebase-realtime-database kotlin

我正在为我的大学申请考勤,根据他们的角色,将用户重定向到正确的家庭活动。为此,我制作了3个服务类,用户角色服务,教师数据服务和学生数据服务。

在用户角色服务单身中,它正在阅读用户使用它的角色' uid'来自firebase数据库。根据返回的值,它调用Faculty-D​​ata-Service或Student-Data-Service单例中的函数来存储用户信息.User-Role-Service Code: -



fun getRole (complete:(Boolean) -> Unit) {
        val auth = FirebaseAuth.getInstance()
        val user = auth.currentUser?.uid
        val ref = mDatabaseReference.child("Users").child(user)
        println(ref)
        if( user != null) {//[Start : of Null Check]
            //[Start : of ValueEventListener Object] --> func# 2
            mValueEventListener = object : ValueEventListener {
                override fun onDataChange(dataSnapshot: DataSnapshot?) {
                    dataSnapshot?.children?.forEach {
                        role = it.child("role").value.toString()
                        if(role == "faculty"){
                            FacultyDataService.storeFacultyData(it) {
                                when(it){
                                    true -> complete(true)
                                    false -> Log.d(TAG, "FacultyDataService.storeFacultyData() failed")
                                }
                            }
                        } else if(role == "student"){
                            StudentDataService.storeStudentData(it) {
                                when(it){
                                    true -> complete(true)
                                    false -> Log.d(TAG, "StudentDataService.storeStudentData() failed")
                                }
                            }
                        } else {
                            Log.d(TAG,"Role is neither student nor faculty.")
                        }
                    }//[End : forEach.]
                }//[End : onDataChanged]
                override fun onCancelled(p0: DatabaseError?) {
                    Log.d(TAG, "VEL database error")
                    complete(false)
                }//[End : ^]
            }//[End : func# 2.]
        }//[End : of Null Check]
        else{
            Log.d(TAG, "authToken is null")
        }
        ref.addValueEventListener(mValueEventListener)
    }
}




这是我收到的日志消息:

  

D / UserRoleService:角色既不是学生也不是教师。

我相信这种情况正在发生,因为它没有读取子节点的值。但是它在正确的路径上,因为当我记录路径时它返回正确的路径并且还返回子项的键。 我不知道我哪里出错了,请指导。

此处的Firebase结构。

enter image description here

另外,我将DataSnapshot作为storeFacultyData(ds)和storeStudentData(ds)函数的参数传递。这可能会产生任何问题吗?

1 个答案:

答案 0 :(得分:0)

您正在循环生成的快照的子项。只有当您可能有多个结果时才需要这样的循环,而这种情况并非如此。由于您直接读取要加载的特定用户的节点,因此只有一个结果。

所以删除循环你应该是好的:

override fun onDataChange(dataSnapshot: DataSnapshot?) {
    role = it.child("role").value.toString()
    if(role == "faculty"){
        FacultyDataService.storeFacultyData(it) {
            when(it){
                true -> complete(true)
                false -> Log.d(TAG, "FacultyDataService.storeFacultyData() failed")
            }
        }
    } else if(role == "student"){
        StudentDataService.storeStudentData(it) {
            when(it){
                true -> complete(true)
                false -> Log.d(TAG, "StudentDataService.storeStudentData() failed")
            }
        }
    } else {
        Log.d(TAG,"Role is neither student nor faculty. It is: "+role)
    }
}//[End : onDataChanged]