【问题标题】:How to store array in firebase using Angular如何使用Angular将数组存储在Firebase中
【发布时间】:2020-05-07 07:04:52
【问题描述】:

我需要使用 Angular 将 Array 存储在 Firebase 中。我无法做到这一点。请帮忙。 我得到的是:

我想要的是这个:

-|bucketList
    |-zjSaw3efefsfsdffg
       0-| bItem: 'thailand'
         | isCompleted: false

       1-| bItem: kasar devi
         | isCompleted: false

等等

我正在这样做:

 const bucketRef = this.angularFireDb.list('/bucketList/' + uid );
 bucketRef.push(bucketListItems);

【问题讨论】:

  • 能否分享bucketListItems对象的内容。
  • @RenaudTarnec 是的。我正在发送一个对象 {bItem: this.bucketListItem, isCompleted: false} 并且 this.bucketListItem 是动态的,即来自用户
  • 所以你是逐个对象推送对象,而不是包含多个{bItem: this.bucketListItem, isCompleted: false}。由于您推送了一个名为 bucketListItems 的对象带有 s 我想也许您推送了一个对象列表(即使每个对象的 id 似乎确实来自单独的推送)。
  • 实际上,该功能是我必须一次推送 1 个对象,并且每次推送时它都应该在数据库中更新,例如 0 1 2 .... 这可能吗? @RenaudTarnec

标签: angular firebase firebase-realtime-database angularfire2 angular-datatables


【解决方案1】:

我尝试了一些东西并想出了一些东西。发布它以便它可以帮助任何寻找相同东西的人。

在我的组件中,我首先将对象推送到数组中,然后将该数组发送到服务

      this.bucketListArray.push({bItem: this.bucketListItem, isCompleted: false});
      this.authService.saveUserBucketListInDb(this.bucketListArray);

在我的服务中,我正在做的是:

saveUserBucketListInDb(bucketListItems: Array<object> ) {

this.angularFireDb.object('/bucketList/' + uid).set({
  bucketListItems
});

}

这最终给了我想要的东西,即:

谢谢。

【讨论】:

    【解决方案2】:

    通过使用push(),您可以生成一个新节点,其 id 由 Firebase (-Lz6G...) 自动生成。

    如果您想使用您生成的 id(012 在您的情况下)编写一个节点,则必须使用 set() 方法。

    您可能会遇到的问题(因为您创建像{bItem: this.bucketListItem, isCompleted: false} 这样的对象一个一个)是您不知道数据库中存在的最后一个 id 是什么。因此,您必须查询数据库以找到最后一个 id 的值并将其递增(最好通过transaction)。

    或者,如果您能够使用对象数组一次性创建对象,如下所示,节点 ID 将遵循 012 序列。

    您可以尝试以下方法:

      var bucketListItems = [
        { bItem: 'Item1', isCompleted: false },
        { bItem: 'Item2', isCompleted: false }
      ];
    
      const bucketRef = this.angularFireDb.list('/bucketList/');
    
      bucketRef.set(uid, bucketListItems);
    

    【讨论】:

    • this.angularFireDb.object('/bucketList/' + uid).set({ 0: bucketListItems}); 如果我做这样的事情,那么它只适用于一项。这意味着,如果我这样做this.angularFireDb.object('/bucketList/' + uid).set({1: bucketListItems});,那么它将覆盖现有的。
    • 如果你先this.angularFireDb.object('/bucketList/' + uid + '/0').set(bucketListItems); 然后this.angularFireDb.object('/bucketList/' + uid + '/1').set(bucketListItems); 呢?
    • 我尝试了一些方法,它成功了,这为我省去了跟踪迭代的麻烦。我已经发布了答案。请检查并谢谢。
    • 如果我理解正确,您正在使用数组来保存不同的 bucketListItems
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多