Ios 控制Firebase上的数据更新

Ios 控制Firebase上的数据更新,ios,firebase,firebase-realtime-database,Ios,Firebase,Firebase Realtime Database,我正在将Firebase用于一个小的iOS项目,我想知道下面是否可行 在给定节点“myNode_123”下,我存储数据记录;每个记录的形状如下: [fieldStr: "ABC_xyz", fieldNum: 678] 记录实际上是一个子节点 现在我的问题是关于更新数据,对于已经存在的记录 只有当fieldNum的新值高于已有值时,才允许某人更新数据记录。 无论如何,fieldStr的值应该保持原样 我已经写了一些规则来确保fieldNum满足我的请求。 但我仍然有一个问题,fieldStr有

我正在将
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专家有什么建议吗?

将其添加到$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。

我尝试了两种方法来包含您建议的代码,但在这两种情况下都会出错。你到底是如何包含它的?更新:我也改变了你的写作规则,因为它看起来不必要的复杂。好的,谢谢。现在没有错误了。但这并不是我想要的。如果记录显示了正确的fieldNum和不同的fieldStr,则仍应使用新的fieldNum更新该记录,并且应忽略fieldStr。现在,如果fieldStr与现有的不同,则根本没有更新。写入要么全部成功,要么全部失败。没有中间连接。您只需使用新编号写入myNode_123/$Record/fieldNum即可。这样你就完全绕过了fieldStr。