Firebase:如何自动更新多个资源?

2023-12-04

Firebase 允许更新资源交易地。据我了解,客户端执行此操作,向服务器发送请求,说“如果旧值是 X,则将新值设置为 Y”。如果存在争用,服务器可能会拒绝来自客户端的多个更新,直到其中一个更新被接受为止。

现在,如果我想自动更新多个资源该怎么办?

如果接受第一个更新,然后在接受第二个更新之前客户端断开连接,会发生什么情况。有什么方法可以将多个更新包含在原子事务中吗?如果没有,这个问题有惯用的解决方案吗?


UPDATE

现在可以自动更新多个位置。看这篇博文了解详情。

var mergedUpdate = {};
mergedUpdate[ 'users/' + userId + '/widgets/' + widgetId ] = true;
mergedUpdate[ 'widgets/' + widgetId ] = widgetData;

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/");
ref.update(mergedUpdate);

这不会强制执行事务数据(如果值当前为 X,则将其设为 Y),但这部分可以移至安全规则。例如,如果我们想同时更新两个计数器,我们可以添加如下规则:

{
  "counter1": {
     ".validate": "newData.val() === (data.val()||0)+1"
  },

  "counter2"1 {
     ".validate": "newData.val() === (data.val()||0)+1"
  }
}

现在我们可以尝试与上面相同的多路径更新。如果自我们上次从服务器读取值以来这些值已更改,则尝试将失败。我们可以检查if( error.code === 'PERMISSION_DENIED' ) { ... }查看失败是否是由于验证造成的,然后相应地重试。

原帖

做到这一点的唯一方法是在共同祖先上运行事务。

例如,如果您想更新 /a/b/c 和 /a/x/y,您可以在 /a 运行事务并更改这两个值。

这种方法的缺点是网络 I/O 的成本可能很高,因为事务中的所有数据都需要下载然后发送回服务器。

您可能需要考虑的一种更复杂但可能更强大的方法是重组数据,这样您就可以存储编辑历史记录,而不是存储实际值。例如,如果您要存储银行余额信息,则可以存储存款和取款的历史记录。然后,当您想要获得余额时,您将回放整个历史记录并计算最终余额。

这种方法的优点在于它可以让您进行原子更新。例如,如果您要将资金从账户 A 转账到账户 B,您只需在日志末尾附加一个元素,表示“从账户 A 转账到账户 B N 美元”。附加该单个元素是一个原子操作。

这就是我们采取的方法Firepad,我们的协作文本编辑器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase:如何自动更新多个资源? 的相关文章

随机推荐

  • WPF:使用线程访问 UI 对象会出现错误

    我有一个在文件夹中修改文件时调用的函数 此函数更新存储在 UI 中的列表视图的项目 这是函数 Private Sub FileChangeNotify Try LstMoulures Items Refresh Catch ex As Ex
  • 传递 ArrayList 到 Activity

    我搜索了一些主题 但没有找到解决我的问题的方法 public class Series implements Parcelable private String name private int numOfSeason private in
  • 图表工具在 Visual Studio 中呈灰色显示

    我正在尝试将图表添加到 Visual Studio 表单 但该按钮呈灰色 我正在使用 NET Framework 3 5 和 C 按照在线说明 我已从此链接下载并安装了 dll 文件 http www microsoft com en us
  • 如何在表单提交后使用 Ajax POST

    我认为这很简单 但我无法在任何地方找到如何做到这一点 正如标题所示 在成功提交表单帖子后如何执行 ajax 帖子 我试图搜索它 但我看到的只是与我需要的相反 这是在 ajax 帖子之后提交的 我会尝试制作一个与我正在做的非常相似的程序草案
  • React Native - 使用状态时文本输入闪烁

    我正在向 TextInput 组件的输入文本添加一些验证 TextInput 的值在状态中处理 并且仅在输入的值有效时更新 我的代码看起来像这样 class TextInputWithValidation extends Component
  • 选择时间序列的一部分

    在下面的代码中 我创建了一个简单的数据系列 一个时间向量 然后创建了一个时间序列 我对两者的绘制都没有问题 它们位于同一个图上并不重要 我无法弄清楚如何对时间序列的一部分进行子集化 如最后一个因错误而失败的命令所示 gt gt timese
  • 无法序列化/反序列化 ArrayList

    我正在尝试序列化和反序列化一个数组列表 其中包含一个对象 HairBirt param new HairBirt param setName name param setValue 2 3f HairBirt param2 new Hair
  • 有效地对矩阵进行行标准化

    我需要一种有效的方法来对稀疏矩阵进行行标准化 Given W matrix 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0
  • 注释属性的值必须是常量表达式

    我有一个通过 spring 注释读取的属性文件 如下所示 Value platform private String platform 获得平台参数后 我想读取第二个参数 具体取决于platform参数值 Value url platfor
  • 使用 JSON.NET 返回 ActionResult [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个 C 方法来序列化模型并返回 JSON 结果 这是我的代码 public ActionResult Read DataSourceRequest DataSourceRequest reques
  • 如何将 JSONArray 转换为 ListView?

    我有一个执行以下操作的代码 通过 HttpClient 连接到 Web 服务到 PHP 文件 返回 SQL 查询的结果 返回格式为jArray JSONArray for int i 0 i lt jArray length i json
  • 如何从动态创建的(Java 中)layer-list / LayerDrawable 中获取 Android 资源 ID?

    此问题 答案帖子中的 解决方案 2 动态 在android中叠加两个图像以设置imageview 与我想要做的非常接近 即动态创建一个图层列表 对于状态栏通知图标 我想在图层中构建我的图标 但是通知API中的图标分配需要资源ID 我想从服务
  • Display.HdrCapability 和configuration.isScreenHdr 之间有什么区别

    我想了解 Android 上的 HDR 功能 因此我编写了以下代码来检查这一点 Display display getWindowManager getDefaultDisplay Display HdrCapabilities hdrCa
  • Sqlalchemy - 执行原始 SQL 查询

    我在连接到多个数据库的 Flask 应用程序中使用 sqlalchemy 使用如图所示的绑定here 我想在非主数据库之一上执行原始 SQL 查询 我正在尝试使用会话 执行 如此处所示 但它针对主数据库执行 API 文档声明您可以使用一个参
  • 自动完成 HTML 中的 ERROR 404(使用 ASP.NET 和 JQuery)

    由于某些原因 在 ASP NET 项目中 我的自动完成功能无法正常工作 我尝试了在数据连接中使用数据源的不同方法 但无济于事 我已经为其创建了一个名为 Diagnose 的数据库 但由于某种原因 它在 jquery 上显示错误 404 这是
  • 如何使我的 css 文件在 django 中工作

    我是 django 新手 但在 python 方面有一些相关技能 我刚刚开始在 django 中构建一个项目 到目前为止我已经能够在我的项目中创建一个应用程序 另外 我已经能够将我的网站的index html文件链接到django 并且在命
  • Final ArrayList 的意义是什么?

    通过将 ArrayList 或其他 Collection 设为 Final 我们可以获得哪些优点 缺点 我仍然可以向 ArrayList 添加新元素 删除元素并更新它 但最终的效果是什么 但最终的效果是什么 这意味着您无法重新绑定变量以指向
  • 如何在 JavaScript 中设置浏览器特定的 css?

    如何设定风格 webkit box shadow 0px 0px 11px 000通过 JavaScript 到一个元素 您可以使用style object element style webkit box shadow 0px 0px 1
  • 活动堆栈问题

    我有两组活动 假设每组有 3 个活动 A1 B1 C1 A2 B2 C2 我从 A1 启动我的应用程序 然后 gt B1 gt C1 这里我想从 C1 跳转到 gt A2在 A2 处 如果我按回键 应用程序应该存在 而不是让我返回 C1 然
  • Firebase:如何自动更新多个资源?

    Firebase 允许更新资源交易地 据我了解 客户端执行此操作 向服务器发送请求 说 如果旧值是 X 则将新值设置为 Y 如果存在争用 服务器可能会拒绝来自客户端的多个更新 直到其中一个更新被接受为止 现在 如果我想自动更新多个资源该怎么