2016-02-23 73 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'不會觸發刪除操作。如果這對你沒有問題,那麼「耶」。 :-) –