控制Firebase上的数据更新

时间:2017-04-06 07:36:15

标签: ios firebase firebase-realtime-database

我正在使用Firebase进行小型iOS项目,我想知道以下是否可行。

在给定节点" myNode_123"我存储数据记录;每条记录的形状如下:

[fieldStr: "ABC_xyz", fieldNum: 678]

记录实际上是一个子节点。

现在我的问题是关于更新现有记录的数据。

只有当fieldNum的新值高于已存在的值时,才允许某人更新数据记录。 无论如何,fieldStr的值应该保持不变。

我已经编写了一些规则来确保fieldNum满足我的请求。 但我仍然认为fieldStr有被改变的风险。

以下是我的规则:

{
  "rules": {
    ".read": true,
    //".write": true
    "myNode_123": {
        "$Record": {
            // Ensure that we are either creating a new record not yet existing,
            // or that we are only updating for a higher fieldNum.
           ".write": "(!root.child('myNode_123/'+$Record).exists()) ||
           (root.child('myNode_123/'+$Record).exists() && (newData.child('fieldNum').val() > data.child('fieldNum').val()))"
        }
    }
  }
}

fieldNum的控制正如我所愿。但是仍然可以改变fieldStr,这是我不想要的。

Firebase专家的任何建议?

1 个答案:

答案 0 :(得分:0)

在$ Record。

下添加
{
  "rules": {
    ".read": true,
    //".write": true
    "myNode_123": {
      "$Record": {
         // Ensure that we are either creating a new record not yet existing,
         // or that we are only updating for a higher fieldNum.
        ".write": "!data.exists() || newData.child('fieldNum').val() > data.child('fieldNum').val()",
        "fieldStr": {
          ".validate": "!data.exists() || data.val() == newData.val()"
        }
      }
    }
  }
}

!data.exists()将确保只能将新数据写入此位置。并且data.val() == newData.val()将添加一个异常,以便在新数据与旧数据相同时允许写入,以防您想要将整个对象写入数据库并包含fieldStr。