在Firebase中将数据保存到子级

时间:2018-01-28 08:08:03

标签: firebase firebase-realtime-database

我有一个小应用程序,用户可以根据他们最近在各种运动中的表现来投票或者投票。

当点击upvote按钮时,选民的UID(通过Google登录)应该被推送到投票的相应玩家的数据库中。像这样:

enter image description here

然而,相反,它目前正在这样做: enter image description here

以下是执行Firebase工作的代码。我认为这是其中一条我错了。

  

this.database.child(playerId).transaction

  

ref = firebase.database()。ref('球员/选民');

代码:

this.database = firebase.database().ref().child('players');

upvotePlayer(playerId) {
this.state.user ?
  this.database.child(playerId).transaction(function (player) {
    if (player) {
      console.log("UID: " + uid)
      var ref = firebase.database().ref('players/voters');
      ref.child(uid).set(1);
    }
    return player;
  })
  :
  console.log("Must be logged in to vote.")

  }

3 个答案:

答案 0 :(得分:1)

问题在于:

 var ref = firebase.database().ref('players/voters');

它正在voters节点下添加players,而不是push id节点下。

所以你必须从数据库中检索pushid,然后执行以下操作:

  var ref=firebase.database().ref().child('players').child(playerId).child('voters');
因此,选民将成为pushid孩子中的一员。

对于未来观众:

最好在以下情况下使用交易:

  

如果多个用户同时支持同一个帖子或客户端有陈旧数据,则使用事务可防止upvote计数不正确

答案 1 :(得分:1)

您将投票存储在此路径players/voters中,而它应位于此路径中players/$playerId/voters

结帐

this.database = firebase.database().ref().child('players');

upvotePlayer(playerId) {
    this.state.user ?
        this.database.child(playerId).transaction(function (player) {
            if (player) {
                console.log("UID: " + uid)
                var ref = firebase.database().ref('players/' + playerId + '/voters');
                ref.child(uid).set(1);
            }
            return player;
        })
        :
        console.log("Must be logged in to vote.")
}

transaction方法有transactionUpdate函数作为参数,应该返回新值并且你没有返回任何,我认为更好的解决方案是不使用事务

编辑:没有交易的解决方案

upvotePlayer(playerId) 
{
    if(this.state.user)
    {
        let ref = firebase.database().ref('players/' + playerId + '/voters');
        ref.child(uid).set(1);
    }
    else
    {
        console.log("Must be logged in to vote.")
    }
}

答案 2 :(得分:0)

实际上,您正在将该值推送到具有玩家ID的付款人节点。您已将数据推送到玩家身份voters的子节点。试试这个代码: -

this.database = firebase.database().ref().child('players');

upvotePlayer(playerId) {
this.state.user ?
  this.database.child(playerId).transaction(function (player) {
    if (player) {
      console.log("UID: " + uid)
      player.ref.child(voters).push(uid);
    }
    return player;
  })
  console.log("Must be logged in to vote.")

  }

问题是你实际上是在players节点的引用并在名为voters的同一级别的playerid上创建新节点。下面的行只需在与voters相同的级别创建一个新节点playerid

  var ref = firebase.database().ref('players/voters');
  ref.child(uid).set(1);

如您所见,voters根节点中没有名为players的节点。但是您设置的值是使用set()函数

创建的新数据