我正在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
的节点。它是一个数组。
只想知道如何在此结构中使用子节点生成数组,请进行指导。
这是我真正想要的。
答案 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;
}, {});
}