【问题标题】:Firebase setValue not creating unique child node?Firebase setValue 没有创建唯一的子节点?
【发布时间】:2017-07-16 14:38:50
【问题描述】:
    ArrayList<ListingModel> list = new ArrayList<ListingModel>();
    list.add(model);
    list.add(model2);
    list.add(model3);
    list.add(model4);

    for (ListingModel m : list) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("node");
        myRef.push().setValue(m);

    }

我正在尝试将 4 个对象从 android 应用程序保存到 firebase 数据库。所以我使用循环将数据存储到节点中。它应该创建 4 个具有自动 ID 的不同子对象并将对象存储在那里。但它只将最后一个模型存储在一个唯一的 id 中,如下图所示:

如何保存所有四个具有唯一 ID 的对象(列表中的数据)?

【问题讨论】:

  • 保持在循环外初始化引用:` FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("node"); for (ListingModel m : list) { myRef.push().setValue(m); }`
  • 即使我在循环外实例化引用,结果也相同。 @JerinAMathews
  • CompletionListener 添加到setValue() 以查看是否有任何写入失败。您是否对node 的孩子有可能拒绝前三个模型的安全规则?我运行了您的代码,但无法重现您的结果。
  • 是的@BobSnyder 上面的代码没有错误。我的错。请参阅下面的答案。

标签: android firebase firebase-realtime-database


【解决方案1】:

在 firebase 上完整记录

private void writeNewPost(String userId, String username, String title, String body) {
// Create new post at /user-posts/$userid/$postid and at
// /posts/$postid simultaneously
String key = mDatabase.child("posts").push().getKey();
Post post = new Post(userId, username, title, body);
Map<String, Object> postValues = post.toMap();

Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/posts/" + key, postValues);
childUpdates.put("/user-posts/" + userId + "/" + key, postValues);

mDatabase.updateChildren(childUpdates);
}

将您的模型放入地图中,放置它们,然后使用updateChildren

【讨论】:

    【解决方案2】:

    最好的办法是使用for循环。

        ArrayList<ListingModel> list = new ArrayList<ListingModel>();
        list.add(model);
        list.add(model2);
        list.add(model3);
        list.add(model4);
    
        for (int i =0; i<list.size();i++){
            ListingModel model = list.get(i); 
            FirebaseDatabase database = FirebaseDatabase.getInstance(); 
            DatabaseReference myRef = database.getReference("node"); 
            myRef.child(i).setValue(model);
    
        }
    

    【讨论】:

      【解决方案3】:

      所以问题在于我如何设置模型(对不起,我的问题中有部分代码)

          ListingModel model = new ListingModel();
          model.setTitle("test0");
      
          ListingModel model1 = new ListingModel();
          model.setTitle("test1");
      
          ListingModel model2 = new ListingModel();
          model.setTitle("test2");
      
          ListingModel model3 = new ListingModel();
          model.setTitle("test3");
      

      我正在实例化不同的模型,但只改变了第一个 模型 的值。

      model1、model2 和 model3 是空的,因此没有出现在 firebase 数据库中,因为它是一个空对象。

      【讨论】:

        【解决方案4】:

        我认为代码只读取了一次推送。并且当你使用同一个id写入数据时,会覆盖之前的版本。

        ArrayList<ListingModel> list = new ArrayList<ListingModel>();
        list.add(model);
        list.add(model2);
        list.add(model3);
        list.add(model4);
        
        for (ListingModel m : list) {
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("node");
            String modelID = myRef.push().getKey();
            myRef.child(modelID).setValue(m);
        }
        

        试试这个,希望对你有帮助。

        顺便说一句,练习使用 updateChildren 而不是 setValue 来保存数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-28
          • 1970-01-01
          • 1970-01-01
          • 2017-04-30
          相关资源
          最近更新 更多