2016-02-23 28 views
0

我在火力地堡以下数据:在覆盖之前检查Firebase的现有数据?

  • 设备
    • iphone5的
      • DATE_CREATED: “1456183905”

我试图确定是否存在“date_created”,如果它不存在,则创建它。

我读过快照,但有没有更简单的方法来检查Firebase以查看这些数据是否存在?我现在所使用的是快照,但它与事件处理程序绑定在一起。我不能只是做一个基本的查询,看看这个条目是否存在?

谢谢。

+1

你实际上可以在你的安全规则中处理这个,查看https://www.firebase.com/docs/security/api/rule/validate.html –

+0

哦!安全规则可以做到这一点?太棒了,谢谢,我会用这些。谢谢,安德烈。 – SH10151

回答

2

您可以测试是否在您的银行代码存在价值,通过:

let ref = Firebase(url: "https://stackoverflow.firebaseio.com/35570687") 
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in 
    if (!snapshot.exists()) { 
     ref.setValue([".sv": "timestamp"]) 
    } 
    else { 
     print("already exist") 
    } 
}) 

但因为这是唯一的客户端,有一个机会,两个客户端运行的代码几乎确切时间并且最终都会写入时间戳。在上面的代码片段中,这不是一个问题,但在实际使用情况下,这种竞争条件可能是不需要的。

安德烈评论,你可以在你的安全规则验证这一点:

"date_created": { 
    ".write": "!data.exists() || data.val() == newData.val()" 

这验证了无论这是你写date_created第一次(这样的数据还不存在),或者以其他方式使价值不变。

+0

谢谢你们,非常感谢! – SH10151

+0

事实上,只是一个笔记,事实证明,答案中的安全规则示例需要“.validate”而不是“.write”。至少在我的代码中,这是它的工作原理。它没有工作,直到我改变它,我才弄清楚。不过,我感谢所有的帮助! – SH10151

+0

嗯,我使用'.write',因为'.validate'不会触发删除操作。如果这对你没有问题,那么“耶”。 :-) –