firebase - 如何在 Firebase 中使用离线用户更新库存?
问题描述
Firebase:如何使用离线用户更新库存?
我有一个使用 Flutter 和 Firebase 构建的 Agro 应用程序。该应用程序的工作原理如下:
- 您在仓库中有食品库存
- 用户在离线模式下外出喂养动物(他们在农场)
- 然后它们返回并根据 Firebase 的 Offline 属性执行数据库写入
当用户在喂食时在线时,一切正常,但是在离线模式下喂食时,我遇到了专门更新库存的问题,因为离线用户缓存的库存可能与实际库存不同(因为引入了新食物或因为来自其他用户的在线更新)。
我将数据写入 Firebase 的方式(使用 BLOC 模式)如下:
Future<bool> actualizarCantidad(String idAlimento, double cantidadActualizada) async {
try {
db.child('alimento/$idAlimento').update({ "cantidad": cantidadActualizada});
} catch (e) {
print(e);
}
return true;
}
读取库存和排序数据库更新的函数如下:
Future<void> _submit() async {
_alimento = await alimentoBloc.cargarAlimento(alimentar.idAlimento);
//To read the inventory for the specific food type (alimentar.idAlimento)
final _cantAlimento = _alimento.cantidad - _consumoTotal;
//_alimento.cantidad is refered to the inventory
//_consumoTotal is the quantity to reduce (eaten food)
_alimentoBloc.actualizarCantidad(alimentar.idAlimento, _cantAlimento);
//Use the BLOC and PROVIDER pattern to Update the Inventory with a new Quantity (_cantAlimento)
}
我想在 Firebase 中做的是,不是将 _cantAlimento 数量分配给 Inventory,而是执行“减少 Inventory 中数量的 _consumoTotal”之类的操作,这样用户是离线还是在线都无关紧要。这可能吗?
我审查过的另一种选择是使用事务来确保您使用的是最新数据,但是当用户离线时事务会丢失,因此这是不可能的。
考虑到我的用户经常离线,我如何以正确的方式更新库存?
解决方案
从几个月前开始,Firebase 实时数据库支持一种ServerValue.increment()
可用于以原子方式递增/递减数据库中的值的操作,即使客户端未连接到服务器也是如此。
这个新方法也刚刚登陆 FlutterFirefirebase_database
插件ServerValue
类的 4.1 版本。如果您对此有任何疑问,我会提交错误或对功能请求发表评论。
推荐阅读
- discord.js - 使用命令 discord.js 更改变量
- java - 如何在不影响其他集合的情况下编写联合方法?
- javascript - Javascript:将文本映射到异步函数
- swift - 如何找出我应该在 Swift 中添加哪些方法?
- java - 如何将元素添加到 Java 中不同类中的数组
- javascript - 通过 Tableau JavaScript API 在多个相关(具有相同维度)的工作表中应用标记选择
- javascript - 平滑动画图像位置和缩放以适应 HTML/CSS 中的屏幕
- cmake - 自定义目标的属性
- react-i18next - 如何使用 react-i18next 定义消息
- lua - 如何在单独的行上读取字符串