我正在为我的大学申请考勤,根据他们的角色,将用户重定向到正确的家庭活动。为此,我制作了3个服务类,用户角色服务,教师数据服务和学生数据服务。
在用户角色服务单身中,它正在阅读用户使用它的角色' uid'来自firebase数据库。根据返回的值,它调用Faculty-Data-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结构。
另外,我将DataSnapshot作为storeFacultyData(ds)和storeStudentData(ds)函数的参数传递。这可能会产生任何问题吗?
答案 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]