2016-02-23 5 views
0

у меня есть следующие данные в Firebase:Проверить Firebase для существующих данных перед перезаписью?

  • устройства
    • iPhone5
      • DATE_CREATED: "1456183905"

Я пытаюсь определить, существует ли «date_created», а если нет, то создайте его.

Я прочитал о моментальных снимках, но есть ли более простой способ проверить Firebase, чтобы узнать, существуют ли эти данные? Теперь у меня есть моментальные снимки, но привязаны к обработчику событий. Не могу ли я просто выполнить основной запрос, чтобы увидеть, существует ли эта запись или нет?

Спасибо.

+1

Вы можете справиться с этим в своих правилах безопасности, ознакомьтесь с https://www.firebase.com/docs/security/api/rule/validate.html –

+0

Oh! Правила безопасности могут это сделать? Удивительно, спасибо, я буду использовать их. Спасибо, Андре. – SH10151

ответ

2

Вы можете проверить, если значение существует в вашем Swift код, с помощью:

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' не запускается для операции удаления. Если это не проблема для вас, тогда «yay». :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^