将项目添加到 Firebase 数据库中的列表

新手上路,请多包涵

我有以下 Firebase 数据库结构。 uIdsList<String> 的一种。我正在尝试在 uIds 下添加另一个 uId,并增加索引。 setValue()updateChildren() 将要求我检索现有数据, push() 将添加一个项目,而不是随机生成的索引字符串作为键。有没有不需要检索现有数据的更简单的方法?谢谢!

   "requests" : {
    "request001" : {
      "interests" : [ "x" ],
      "live" : true,
      "uIds" : [ "user1" ]  // <---- from this
    },
    "request002" : {
      "interests" : [ "y" ],
      "live" : true,
      "uIds" : [ "user2" ]
    }
  }

——————————

编辑:

抱歉不清楚。让我详细说明一下。假设我有上面的数据库并想将其更新为以下内容。

   "requests" : {
    "-KSVYZwUQPfyosiyRVdr" : {
      "interests" : [ "x" ],
      "live" : true,
      "uIds" : [ "user1", "user2" ]   // <--- to this
    },
    "-KSl1L60g0tW5voyv0VU" : {
      "interests" : [ "y" ],
      "live" : true,
      "uIds" : [ "user2" ]
    }
  }

ishmaelMakitla 的建议 mDatabase.child("requests").child("request001").setValue(newRequest) 将用“newRequest”覆盖“request001”。所以我应该检索“request001”的现有数据并将“user2”添加到列表 uIds 。它将是这样的:

 mDatabase.child("requests").child("request001").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Request newRequest = dataSnapshot.getValue(Request.class);
        newRequest.uIds.add("user2");
        mDatabase.child("requests").child("request001").setValue(newRequest);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}

});

但我想知道这个过程是否有必要,因为我想做的只是将一项添加到列表中 uIds

原文由 Megool 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 328
2 个回答

有关创建可缩放数据的 Firebase 文档 建议您使用不同的数据结构:

 "requests" : {
  "-KSVYZwUQPfyosiyRVdr" : {
    "interests" : { "x": true },
    "live" : true,
    "uIds" : {
      "user1": true,
      "user2": true
    }
  },
  "-KSl1L60g0tW5voyv0VU" : {
    "interests" : { "y": true },
    "live" : true,
    "uIds" : {
      "user2": true
    }
  }
}

以下是此数据结构更好工作的几个原因:

  • 每个 uid 现在可以自动只出现一次。我们基本上将数据建模为 set ,而不是使用数组。
  • 添加项目现在就像 ref.child("uUids").child("user3").setValue(true) 一样简单
  • 您现在可以检查您的安全规则中是否存在 uid。

我已经开始对自己重复: 每当你发现自己在做 array.contains("xyz") 时,你应该使用集合而不是数组。 上面与 "key": true 的映射是一个集合在Firebase上的实现。

效率

有些人可能认为数组是一种更有效的存储数据的方式,但对于 Firebase 而言,情况并非如此:

你看到什么了:

 "uIds" : [ "user1", "user2" ]

Firebase 存储什么:

 "uIds" : {
  "0": "user1",
  "1": "user2"
}

所以存储一个集合几乎是一样的:

 "uIds" : {
  "user1": true,
  "user2": true
}

原文由 Frank van Puffelen 发布,翻译遵循 CC BY-SA 3.0 许可协议

当你说 setValue 等要求你检索现有数据时,不确定你的意思。插入新记录的基本流程如下:

 private DatabaseReference mDatabase;
// get reference to your Firebase Database.
mDatabase = FirebaseDatabase.getInstance().getReference();
//and here you add a new child to your 'requests' collection
//I am assuming you have a Request model like this..
Request newRequest = new Request(some-params);
mDatabase.child("requests").child(someRequestId).setValue(newRequest);

您可以查看在 Android Firebase 上保存数据 的基本使用指南。

更新: 根据您的评论-我认为您可以通过以下方式实现您的目标:您使用 push() 方法,每次将新子项添加到指定的 Firebase 引用时,该方法都会生成一个唯一的 ID:

 Firebase newRequestRef = mDatabase.child("request").push();
newRequestRef.setValue(newRequest);

应该这样做。

我希望这有帮助。

原文由 ishmaelMakitla 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题