Firebase,第二个push()在同一方法中不起作用

时间:2016-06-24 20:19:00

标签: android firebase firebase-realtime-database

在我的应用中,有一项活动,点击保存按钮后,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。 我希望我能正确解释我的问题。 请告诉我我做错了什么。 我应该如何修改我的代码,还是应该完全重新考虑我的数据结构?

2 个答案:

答案 0 :(得分:2)

这是一个难题。我复制/粘贴了您发布的代码,并为FirstSecond创建了存根。使用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);