更新firebase路径(如果存在)

Posted

技术标签:

【中文标题】更新firebase路径(如果存在)【英文标题】:Updating firebase path if it exists 【发布时间】:2019-11-17 20:55:00 【问题描述】:

我的应用程序包含 24 小时存在的信息位。此信息有可能被其他用户投票。投票数记录在数据库中。如果有人对一条信息进行投票,我希望它仅在路径当前存在时才更新,因为数据可能已达到 24 小时限制,并且自显示时间和投票时间起已被删除。

使用Datasnapshot.hasChild 之类的问题是我需要编写 2 条单独的读写指令。读取指令的数据可能存在,但可能会达到 24 小时标记并在写入指令之前被删除。


这是我的数据库的结构,节点状态在数据库的另一部分重复,以减少读取量。如果这个节点变为nil,另一个节点仍然存在,但是这个节点在这里,所以我可以通过一次写入来获取所有小于24小时的最新状态。

我想要一个规则,如果 status 的键已更改,或者 status 不再是节点,则不允许更改 votes 的值。

【问题讨论】:

您使用的是实时数据库吗?你是说信息可能在用户设备上,但在他们投票时不再在服务器上? 【参考方案1】:

有几种方法可以解决这个问题。

一种方法是利用 Firebase 规则。在此之前,让我先这样说,让 Firebases 高兴:

规则不是过滤器

但是,您可以制定一个规则,如果某个节点不存在,将阻止写入。我需要知道您的具体结构和用例才能提出解决方案,但 Firebase 规则文档中很好地涵盖了规则,Referencing Data In Other Paths 是一个起点。

但是,一个超级干净的简单选项是下面的代码,它只会写入一个节点,如果它存在的话。一读一写。

func onlyWriteIfNodeExists() 
    let ref = your_firebase.ref.child("may_not_exist")
    ref.observeSingleEvent(of: .value, with:  snapshot in
        if snapshot.exists() 
            snapshot.ref.setValue("updated value")
         else 
            print("node didn't exist")
        
    )

结构是

firebase_root
   may_not_exist: "some value"

所以如果节点 may_not_exist 存在,“some value”将被替换为“updated value”,否则将打印“节点不存在”到控制台。

话虽如此,如果目的是不允许用户对不存在的项目进行投票,那么 UI 应该反映这一点。换句话说,如果应用程序提出要投票的主题并且某个主题超出范围,则应用程序应该收到一个事件,并可能将其从 UI 中删除,或者在主题标题上画一条线以指示它不再可用。

【讨论】:

我更新了我的问题以显示我的数据库结构并解释更多我想要做什么。我认为我正在寻找一个规则。

以上是关于更新firebase路径(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Facebook登录检查用户是不是存在

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba

Stripe 和 Firebase:FirebaseError:collection() 的第一个参数应为 CollectionReference、DocumentReference 或 Fireba

运行 firebase Deploy -Flutter -Firebase 时在错误的路径中生成 Functions 文件夹

向用户更新应用程序布局设计而不在 Firebase 配置中提交更新?

如何做firebase多路径推送?