Firebase - 两个离线设备修改相同的数据和更改顺序

Firebase - Two offline devices modifying same data and order of changes

我有一个 Android 应用程序,可以跟踪一些物品及其数量。

我需要的是一种让用户在离线时通过适当的同步顺序在多个设备上修改数据的方法。

我不知道如何最好地解释它,所以我举个例子:

  1. 设备 A 将项目数量更改为 5。
  2. 设备 B 将其更改为 3。
  3. 设备 B 上线,将服务器上的数据更改为 3。
  4. 设备 A 上线并用 5 替换该数据,这是较旧的更改,不应进行。

这种情况可以在 Firebase 中自然避免吗,或者我是否应该自己在项目上使用时间戳,并且仅在更新时才替换它?

谢谢。

向数据库中的每个项目添加时间戳字段并在 firebase 中编写安全规则似乎可行。
需要考虑的是,当离线时,我唯一能得到的时间戳是来自设备,而不是来自服务器,所以它有时会导致覆盖我们不想要的数据。对于这个项目来说,它仍然足够好。
以下是检查这些时间戳所需的数据库规则:

"$name" : {
         ".write": "!data.exists() || (newData.child('timestamp').isNumber() && data.child('timestamp').val() <= newData.child('timestamp').val())"
      }

上面写着:"you can write if there's no data, or stored data has older timestamp that new request"
制作这些时要记住的重要一点是,父节点会覆盖子节点中的规则。这意味着任何写认证也应该在这个级别上完成。

您可以使用设备时间戳来保留最新数据,并拒绝之前执行的任何数据修改...例如:如果您的数据结构如下

{
    'users': {
        'userId': {
            'timestamp': 1496341800000,
            'var1': 'abc',
            'var2': 'abc'
        }
    }
}

每次更新对象的任何值时,也会更新时间戳,并在 firebase 控制台中添加以下规则

{
"rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "users": {
        "$uid": {
            ".write": "$uid === auth.uid",
            ".validate": "!data.exists() || data.child('timestamp').val() <= newData.child('timestamp').val()"
        }
    }
}
}

每当多个设备联机并更新 firebase 数据库时,将更新具有最新时间戳的数据。