Java 如何在firebase android中查询类似云函数中的数据库触发器

Java 如何在firebase android中查询类似云函数中的数据库触发器,java,android,firebase,firebase-realtime-database,database-trigger,Java,Android,Firebase,Firebase Realtime Database,Database Trigger,在Firebase云函数(Javascript)中,我们使用如下所示的数据库触发器 functions.database.ref('/DoctorApp/DrTimeSlot/{doctorUID}/Patients/{patientID}') .onCreate((snapshot, context) => { // codes here }; 这里,{doctorUID}未知,所以所有函数都在所有UID上工作 在Android Studio(Java)中是否可以使

在Firebase云函数(Javascript)中,我们使用如下所示的数据库触发器

functions.database.ref('/DoctorApp/DrTimeSlot/{doctorUID}/Patients/{patientID}')
    .onCreate((snapshot, context) => { 

    // codes here
};
这里,{doctorUID}未知,所以所有函数都在所有UID上工作

在Android Studio(Java)中是否可以使用相同的方法?下面这个代码对我不起作用,你能给我提供代码的替代品吗

Query query = rootData.child("DrTimeSlot/{drUID}/Patients/").orderByChild("patientUID").equalTo(auth.getUid());

query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                //codes here
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

在android中,您无法执行此查询
子节点(“DrTimeSlot/{drUID}/Patients/”
,所有3个节点都需要已知

如果您不知道
drUID
,那么当您首先将其存储到数据库中时,您可以将其存储到一个变量并传递该变量,例如:

String drUID = ref.push().getKey();

然后您可以使用intent将上述变量传递给不同的活动。

在android中,您无法执行此查询
子节点(“DrTimeSlot/{drUID}/Patients/”
,所有3个节点都需要已知

如果您不知道
drUID
,那么当您首先将其存储到数据库中时,您可以将其存储到一个变量并传递该变量,例如:

String drUID = ref.push().getKey();

然后,您可以使用intent将上述变量传递给不同的活动。

虽然无法使用与云函数相同的语法,但您可以使用以下方法查询具有给定患者ID的所有医生:

Query Query=rootData.child(“DrTimeSlot”).orderByChild(“Patients/”+auth.getUid()).startAt(“”;//startAt(“”)将排除不存在的值
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot queryDataSnapshot){
if(queryDataSnapshot.hasChildren()){
//不处理结果
System.out.println(“未返回结果”);
返回;
}
对于(DataSnapshot doctorDataSnapshot:DataSnapshot.getChildren()){
//TODO:处理数据
System.out.println(doctorDataSnapshot.getKey()+“=>”+doctorDataSnapshot.getValue());
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
//找医生失败,请记录消息
Log.w(标记“findDoctorsForUser:onCancelled”,databaseError.toException());
}
});
但是,要允许这样的操作,客户端必须具有对每个医生数据的读取权限,即使执行搜索的用户不是该医生的患者。它还将完全在客户端设备上处理,这意味着下载
“DrTimeSlot”
下的所有数据,这是不推荐的,也是巨大的安全和隐私风险

相反,在特定用户的用户数据中,存储他们的医生列表。需要查找时,请下载
/users/userId1/doctors
,然后从每个限制读/写访问权限的医生处获取所需的患者数据

“用户”:{
“userId1”:{
“医生”:{
“doctorId1”:true,//为简单起见,为布尔值
“doctorId2”:“儿科医生”,//也可以对类型使用值
“doctorId3”:10、//或访问次数
“doctorId4”:false,//或者如果他们是该医生的活跃患者
},
...
},
...
}

虽然无法使用与云函数相同的语法,但您可以通过以下方式查询具有给定患者ID的所有医生:

Query Query=rootData.child(“DrTimeSlot”).orderByChild(“Patients/”+auth.getUid()).startAt(“”;//startAt(“”)将排除不存在的值
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot queryDataSnapshot){
if(queryDataSnapshot.hasChildren()){
//不处理结果
System.out.println(“未返回结果”);
返回;
}
对于(DataSnapshot doctorDataSnapshot:DataSnapshot.getChildren()){
//TODO:处理数据
System.out.println(doctorDataSnapshot.getKey()+“=>”+doctorDataSnapshot.getValue());
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
//找医生失败,请记录消息
Log.w(标记“findDoctorsForUser:onCancelled”,databaseError.toException());
}
});
但是,要允许这样的操作,客户端必须具有对每个医生数据的读取权限,即使执行搜索的用户不是该医生的患者。它还将完全在客户端设备上处理,这意味着下载
“DrTimeSlot”
下的所有数据,这是不推荐的,也是巨大的安全和隐私风险

相反,在特定用户的用户数据中,存储他们的医生列表。需要查找时,请下载
/users/userId1/doctors
,然后从每个限制读/写访问权限的医生处获取所需的患者数据

“用户”:{
“userId1”:{
“医生”:{
“doctorId1”:true,//为简单起见,为布尔值
“doctorId2”:“儿科医生”,//也可以对类型使用值
“doctorId3”:10、//或访问次数
“doctorId4”:false,//或者如果他们是该医生的活跃患者
},
...
},
...
}

请将数据库结构添加为JSON文件或至少是屏幕截图。客户端查询中没有通配符。您必须知道要查询的单个节点的路径。请将数据库结构添加为JSON文件或至少是屏幕截图。客户端查询中没有通配符。您必须知道要查询的单个节点的路径。