在React Native中如何在Firebase Real Time实时数据库中生成子节点

时间:2019-11-24 05:20:28

标签: reactjs firebase react-native firebase-realtime-database

我正在React Native Firebase数据库中上传一些数据。我必须在其中添加带有单独节点的数据数组。我不明白如何执行它。这是我的代码...

firebase.database().ref('Shops/' + firebase.auth().currentUser.uid).push({
  UserName: this.state.Uname,
  name:this.state.Name,
  tagline:this.state.TagLine,
  description:this.state.Description,
  number:this.state.number,
  image_url_logo:this.state.base64_datalogo,
  image_url_banner:this.state.base64_data,

}) 

我想在其中生成另一个名为products的节点。它是一个数组。 只想知道如何在此结构中使用子节点生成数组,请进行指导。

enter image description here

这是我真正想要的。

1 个答案:

答案 0 :(得分:2)

对于此用例,它就像将数组嵌套在您推送到服务器的数据下一样简单。

firebase.database().ref('Shops/' + firebase.auth().currentUser.uid).push({
  UserName: this.state.Uname,
  name:this.state.Name,
  tagline:this.state.TagLine,
  description:this.state.Description,
  number:this.state.number,
  image_url_logo:this.state.base64_datalogo,
  image_url_banner:this.state.base64_data,
  products: [
    {
      name: 'rubber duck',
      price: '5',
      ...
    },
    {
      name: 'kitchen sink',
      price: '200',
      ...
    }
  ]
})

但是,当您希望在页面上列出所有商店时,就会出现问题。如果要获取每个商店的名称,标语,描述,联系电话和图像,则即使不使用商店,也必须下载商店出售的每个商品的数据。

相反,请考虑将商店的产品拆分到单独的数据库位置。

let shopRef = firebase.database().ref('Shops/' + firebase.auth().currentUser.uid).push();
let shopId = shopRef.key; // unique shop ID

let setShopDataPromise = shopRef.set({
  UserName: this.state.Uname,
  name:this.state.Name,
  tagline:this.state.TagLine,
  description:this.state.Description,
  number:this.state.number,
  image_url_logo:this.state.base64_datalogo,
  image_url_banner:this.state.base64_data,
});

let setShopItemsPromise = firebase.database().ref('ShopItems/' + firebase.auth().currentUser.uid + '/' + shopId).set([
    {
      name: 'rubber duck',
      price: '5',
      ...
    },
    {
      name: 'kitchen sink',
      price: '200',
      ...
    }
]);

Promise.all([setShopDataPromise, setShopItemsPromise])
  .then(() => {
    console.log('Shop uploaded successfully');
  })
  .catch((err) => {
    // something went wrong
    console.error(err);
  });

现在,由于数组是best avoided in Realtime Databases,因此我将通过以下函数运行您的products数组,然后再将它们传递给设置,以使其为own unique product ID。产品仍将以相同的顺序上载,但将使管理更加容易。

function arrayToKeyPairs(arr) {
  let rootRef = firebase.database().ref();
  let newKey = () => rootRef.push().key;
  return arr.reduce((acc, v) => {
    acc[newKey()] = v
    return acc;
  }, {});
}