在我的应用中,有一项活动,点击保存按钮后,push()
应在2个不同的地方制作2组数据,因为在这两个地方都需要一个唯一的ID。
我已按照Firebase指南中的示例代码添加了第二次推送
String userId = auth.getCurrentUser().getUid().toString();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
DatabaseReference firstDatabaseRef = reference.child("first");
DatabaseReference secondDatabaseRef = reference.child("second").child(userId);
String key = firstDatabaseRef.child(userId).push().getKey();
First first = new First(firstAmount,key,firstName);
Map<String, Object> firstValues = first.toMap();
String keySecond = secondDatabaseRef.child(key).push().getKey();
Second second = new Second(secondName,secondAmount,keySecond,key);
Map<String, Object> secondValue = second.toMap();
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/first/" + userId + "/" + key, firstValues);
childUpdates.put("/second/" + userId + "/" + key + "/" + keySecond, secondValue);
reference.updateChildren(childUpdates);
我为first
获得的结果与我预期完全一样,但second
,而不是创建second/<userId>/<key>/<keySecond>/children
,我得到了这个:
"second" : {
//userId
"5TQLPlGf4mbcBRKesQwR30fH1L22" : {
//key
"-KL1030IywlNpkTGC7mU" : {
"secondAmount" : "147",
"Key" : "-KL1030IywlNpkTGC7mU",
"secondName" : "secondName",
"keySecond" : "-KL1030PZlHqD_asSR_8",
}
}
}
而不是将最终的孩子放在另一个唯一的ID中,顺便记录在keySecond
中,它们都直接添加到密钥中。
这是不可接受的,因为每个key
必须有多个keySecond
。
我希望我能正确解释我的问题。
请告诉我我做错了什么。
我应该如何修改我的代码,还是应该完全重新考虑我的数据结构?
答案 0 :(得分:2)
这是一个难题。我复制/粘贴了您发布的代码,并为First
和Second
创建了存根。使用Firebase 9.0.2运行会产生如下所示的结果,我相信这是您所期望的。您使用的是不同的Firebase版本吗?您发布的JSON是否可能由您发布的不同版本的代码生成?
{
"first" : {
// userId
"ypx8RB3eglTBRPeUT7laQVQ1PZQ2" : {
// key
"-KL3rXeYrscFQNrVQnHb" : {
"firstAmount" : "FirstAmount",
"firstKey" : "-KL3rXeYrscFQNrVQnHb",
"firstName" : "FirstName"
}
}
},
"second" : {
// userId
"ypx8RB3eglTBRPeUT7laQVQ1PZQ2" : {
// key
"-KL3rXeYrscFQNrVQnHb" : {
// keySecond
"-KL3rXe_JyY9Vz2U-NES" : {
"Key" : "-KL3rXeYrscFQNrVQnHb",
"keySecond" : "-KL3rXe_JyY9Vz2U-NES",
"secondAmount" : "SecondAmount",
"secondName" : "SecondName"
}
}
}
}
}
答案 1 :(得分:0)
处理updateChildren()
时,Firebase数据库会循环播放您传递的子节点,对于每个键,它基本上会使用您传递的值setValue()
。
这意味着如果您的孩子有重叠键,那么其中一个键的值将被写入最后。这些顺序未定义。
在您的情况下,将更新合并在一起非常容易:
String key = firstDatabaseRef.child(userId).push().getKey();
First first = new First(firstAmount,key,firstName);
Map<String, Object> firstValues = first.toMap();
String keySecond = secondDatabaseRef.child(key).push().getKey();
Second second = new Second(secondName,secondAmount,keySecond,key);
Map<String, Object> secondValue = trans.toMap();
firstValues.put(keySecond, secondValue); // This is the main change
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/first/" + userId + "/" + key, firstValues);
reference.updateChildren(childUpdates);