繁体   English   中英

通过Firebase实时数据库中的子节点获取父节点

[英]Getting parent node through child node in Firebase Realtime database

在我在 Android 工作室的应用程序中,我编写了允许用户预约医生的代码。 所以如果医生接受预约,我想改变子节点“状态”的值。 为此,我需要父节点的值,即这个 .

为此,我尝试使用String currentUserId = ds.getKey(); ,但是 ds,getKey() 给出的值是“Patient”,它是所需父节点的子节点。 那么我如何获得钥匙(图中红色圆圈)?

patRef = database.getReference().child("Patient Appointments");

patRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot ds : task.getResult().getChildren()) {
                String pat = ds.child("Patient").getValue(String.class);

                if(pat.equals(Email)){
                    HashMap update= new HashMap();
                    update.put("Status","Appointment on "+date);

                    String currentUserId = ds.getKey();
                    Toast.makeText(DoctorNotification.this, currentUserId, Toast.LENGTH_SHORT).show();

                    patRef.child(currentUserId).updateChildren(update).addOnSuccessListener(new OnSuccessListener() {
                        @Override
                        public void onSuccess(Object o) {
                            Toast.makeText(DoctorNotification.this, "Appointment accepted", Toast.LENGTH_SHORT).show();
                        }
                    });

                    flag1="True";
                }

            }

            if(flag1.equals("False")){
                Toast.makeText(DoctorNotification.this, "Error", Toast.LENGTH_SHORT).show();

            }
        }

    }
});

正如您自己发现的那样,您可以使用以下命令更新循环中的当前节点:

ds.getRef().child(currentUserId).updateChildren(update)

我想就您查找要更新的节点所采取的方法提供额外的评论。 现在,您加载所有Patient Appointments以找到其中一个,这将是低效的 - 尤其是您开始添加更多预约的那个。

使用查询仅加载当前患者的节点

改善这一点的一种方法是使用查询来仅检索您正在寻找的Patient的约会。 看起来像这样:

patRef = database.getReference().child("Patient Appointments");

Query patientQuery = patRef.orderByChild("Patient").equalTo(Email);

patientQuery.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    ...

然后您可以从onComplete中删除if(pat.equals(Email)){

对 Patient 和 Status 字段使用查询

在此之后的一个较小的优化是您可能只需要检查待处理的约会。 为此,您想要一个像上面这样的查询,但是在两个字段上。

这不是 Firebase 实时数据库本身支持的东西,但您可以通过向数据添加复合字段来模拟它: "Patient_Status": "Elise@doc.com_Pending" 然后查询将变为:

patRef.orderByChild("Patient_Status").equalTo(Email+"_Pending");

将节点的密钥存储在您的 UI 中

最后的改进假设医生实际上看到了所有(待定)约会的列表,然后单击以接受其中的一个或多个。 在这种情况下,您已经从数据库中读取了所有约会以在用户界面中显示它们。

如果您将每个约会的密钥存储在用户界面的(隐藏)字段中,那么您可以在医生单击时使用该密钥,整个更新操作可以变得如此简单:

patRef
  .child("keyOfTheAppointmentTheDoctorClicked")
  .child("Status")
  .setValue("Appointment on "+date);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM