[英]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)){
。
在此之后的一个较小的优化是您可能只需要检查待处理的约会。 为此,您想要一个像上面这样的查询,但是在两个字段上。
这不是 Firebase 实时数据库本身支持的东西,但您可以通过向数据添加复合字段来模拟它: "Patient_Status": "Elise@doc.com_Pending"
。 然后查询将变为:
patRef.orderByChild("Patient_Status").equalTo(Email+"_Pending");
最后的改进假设医生实际上看到了所有(待定)约会的列表,然后单击以接受其中的一个或多个。 在这种情况下,您已经从数据库中读取了所有约会以在用户界面中显示它们。
如果您将每个约会的密钥存储在用户界面的(隐藏)字段中,那么您可以在医生单击时使用该密钥,整个更新操作可以变得如此简单:
patRef
.child("keyOfTheAppointmentTheDoctorClicked")
.child("Status")
.setValue("Appointment on "+date);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.