Firebase Android - datasnapshot 未返回 onChildChanged() 中的所有字段
Firebase Android - datasnapshot not returning all the fields in onChildChanged()
当我的应用程序加载时,数据快照 returns onChildAdded() 方法中子侦听器中的所有字段,这就是我从数据快照填充名为 TaskGroups 的本地列表变量的方式,下面是内容该数据快照
taskGroupList={KYTD1647450187={taskGroupName=Task, taskGroupID=KYTD1647450187, taskGroupColorString=#FFFF0BFF}, AONS1647450187={taskGroupName=Fitness, taskGroupID=AONS1647450187, taskGroupColorString=#FF6E2E7B}, BNZH1648154782={taskGroupName=School, taskGroupID=BNZH1648154782, taskGroupColorString=#FF6E2E7C}
这是添加任何东西之前在 Firebase 上的样子
但是当我尝试从我的 Android 应用程序添加一个新的“任务组”时(我刚刚添加了新的任务组“Apdjf”只是为了这个例子),所有正确的字段都上传到 Firebase,如下图
但是,在我的应用程序的同一侦听器的 onChildChanged() 方法中,我没有收到刚刚添加的新“任务组”的所有字段。相反,我只获得了新添加的任务组的“taskGroupID”,而缺少“taskGroupColorString”和“taskGroupName”字段,我需要所有这些信息来重建我的应用程序的某个部分。以下是我的数据快照给我的内容
taskGroupList={HDCL1649906550={taskGroupID=HDCL1649906550}, KYTD1647450187={taskGroupName=Task, taskGroupID=KYTD1647450187, taskGroupColorString=#FFFF0BFF}, AONS1647450187={taskGroupName=Fitness, taskGroupID=AONS1647450187, taskGroupColorString=#FF6E2E7B}, BNZH1648154782={taskGroupName=School, taskGroupID=BNZH1648154782, taskGroupColorString=#FF6E2E7C}
这是怎么回事?
这是 Java 当我向数据库添加新的“任务组”时调用的代码
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
if (childDataSnapshot.child("taskGroupList").getValue() != null) {
String taskGroupId = generateTaskGroupID();
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupID").getRef().setValue(taskGroupId);
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupColorString").getRef().setValue(finalDatabaseTaskGroupColorString[0]);
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupName").getRef().setValue(taskGroupSelected);
}
}
}
您正在此处共享的代码中执行三个单独的写入操作:
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupID").getRef().setValue(taskGroupId);
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupColorString").getRef().setValue(finalDatabaseTaskGroupColorString[0]);
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupName").getRef().setValue(taskGroupSelected);
如果 taskGroupId
是一个新的唯一 ID,那么第一次调用 setValue
(setValue(taskGroupId)
) 会生成一个 onChildAdded
事件,而另外两个 setValue
调用生成 onChildChanged
个事件。
为防止这种情况发生,您应该在单个写入操作中添加所有子节点,例如:
Map<String,Object> values = new HashMap<>();
values.put("taskGroupID", taskGroupId);
values.put("taskGroupColorString", finalDatabaseTaskGroupColorString[0]);
values.put("taskGroupName", taskGroupSelected);
childDataSnapshot.child("taskGroupList").child(taskGroupId).setValue(values);
现在只有一个写操作,所以这将(如果 taskGroupId
是一个新的唯一 ID)只会导致具有所有三个属性的单个 onChildAdded
调用。
当我的应用程序加载时,数据快照 returns onChildAdded() 方法中子侦听器中的所有字段,这就是我从数据快照填充名为 TaskGroups 的本地列表变量的方式,下面是内容该数据快照
taskGroupList={KYTD1647450187={taskGroupName=Task, taskGroupID=KYTD1647450187, taskGroupColorString=#FFFF0BFF}, AONS1647450187={taskGroupName=Fitness, taskGroupID=AONS1647450187, taskGroupColorString=#FF6E2E7B}, BNZH1648154782={taskGroupName=School, taskGroupID=BNZH1648154782, taskGroupColorString=#FF6E2E7C}
这是添加任何东西之前在 Firebase 上的样子
但是当我尝试从我的 Android 应用程序添加一个新的“任务组”时(我刚刚添加了新的任务组“Apdjf”只是为了这个例子),所有正确的字段都上传到 Firebase,如下图
但是,在我的应用程序的同一侦听器的 onChildChanged() 方法中,我没有收到刚刚添加的新“任务组”的所有字段。相反,我只获得了新添加的任务组的“taskGroupID”,而缺少“taskGroupColorString”和“taskGroupName”字段,我需要所有这些信息来重建我的应用程序的某个部分。以下是我的数据快照给我的内容
taskGroupList={HDCL1649906550={taskGroupID=HDCL1649906550}, KYTD1647450187={taskGroupName=Task, taskGroupID=KYTD1647450187, taskGroupColorString=#FFFF0BFF}, AONS1647450187={taskGroupName=Fitness, taskGroupID=AONS1647450187, taskGroupColorString=#FF6E2E7B}, BNZH1648154782={taskGroupName=School, taskGroupID=BNZH1648154782, taskGroupColorString=#FF6E2E7C}
这是怎么回事?
这是 Java 当我向数据库添加新的“任务组”时调用的代码
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
if (childDataSnapshot.child("taskGroupList").getValue() != null) {
String taskGroupId = generateTaskGroupID();
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupID").getRef().setValue(taskGroupId);
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupColorString").getRef().setValue(finalDatabaseTaskGroupColorString[0]);
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupName").getRef().setValue(taskGroupSelected);
}
}
}
您正在此处共享的代码中执行三个单独的写入操作:
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupID").getRef().setValue(taskGroupId);
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupColorString").getRef().setValue(finalDatabaseTaskGroupColorString[0]);
childDataSnapshot.child("taskGroupList").child(taskGroupId).child("taskGroupName").getRef().setValue(taskGroupSelected);
如果 taskGroupId
是一个新的唯一 ID,那么第一次调用 setValue
(setValue(taskGroupId)
) 会生成一个 onChildAdded
事件,而另外两个 setValue
调用生成 onChildChanged
个事件。
为防止这种情况发生,您应该在单个写入操作中添加所有子节点,例如:
Map<String,Object> values = new HashMap<>();
values.put("taskGroupID", taskGroupId);
values.put("taskGroupColorString", finalDatabaseTaskGroupColorString[0]);
values.put("taskGroupName", taskGroupSelected);
childDataSnapshot.child("taskGroupList").child(taskGroupId).setValue(values);
现在只有一个写操作,所以这将(如果 taskGroupId
是一个新的唯一 ID)只会导致具有所有三个属性的单个 onChildAdded
调用。