2016-03-26 2 views
4

Я новичок в Firebase и не знаю, как лучше всего объяснить это, но я попробую.Записывающие записи Firebase

Я пытаюсь создать приложение для каждого пользователя. Затем каждая пользовательская запись имеет несколько подписок (от 0 до n), где каждая подзапись является простой строкой. В основном есть идентификатор пользователя (основная запись), и их задачи являются подзаголовками.

Теперь моя проблема заключается в том, что всякий раз, когда я вставляю данные (подзаголовки) в основные записи, все предыдущие подзаголовки удаляются, а только самые последние. Я просматриваю документацию и Google, как сумасшедший, но ничего не работает.

Я попытался это:

@IBAction func testWrite(sender: AnyObject) { 
    let def = NSUserDefaults.standardUserDefaults() 
    let uid = def.valueForKey("uid") 
    let root = Firebase(url: getFirebaseURL()) 

    let text = self.tempText.text! 
    let dataRef = root.childByAppendingPath(uid as! String) 
    let data = ["test": String(text)] 
    dataRef.setValue(data) 
} 

Который добавляет к въездному штрафу идентификатора пользователя, с ключом «тест» и значением «текст»

Так я убить приложение и изменить его на:

@IBAction func testWrite(sender: AnyObject) { 
    let def = NSUserDefaults.standardUserDefaults() 
    let uid = def.valueForKey("uid") 
    let root = Firebase(url: getFirebaseURL()) 

    let text = self.tempText.text! 
    let dataRef = root.childByAppendingPath(uid as! String) 
    let data = ["CHANGED": String(text)] 
    dataRef.setValue(data) 
} 

и это толкает отлично, но предыдущая запись была удалена только и единственный вход слева это одна.

Что я пытаюсь сделать, возможно, поэтапно (с номером ключа возможно?) Добавлять элементы по одному, не удаляя другие записи.

Я надеюсь, что это имеет смысл: P и любая помощь очень ценится!

ответ

4

Что происходит здесь, вы устанавливаете весь филиал (Пользователи/Идентификатор_пользователя ##), до значения, и это значение является единым узлом Changed:<somestring>

Концептуально, это может помочь думать о ключ, который вы хотите установить как только одна ветвь например (Пользователи/Идентификатор_пользователя ##/TaskID ##)

так концептуально, а не приближается к нему, как это:
Users/UserID = Key:Value

подход так:
Users/UserID/Key = Value

Примечание: филиал Users/UserID/Key не должен существовать до вы присвоив ей значение.


например, вы можете изменить ссылку на пункт в подразделе вы хотите добавить или изменить:

let dataRef = root.childByAppendingPath(uid as! String + "/Task001") 
dataref.setValue(String(text)) 

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

Documentation Here

Edit: Предлагайте со ссылкой на Фрэнка лучше ответить ниже.

+0

О, я понимаю, что вы имеете в виду. childByAutoId раньше беспокоил меня, но я снова дам ему шанс и поиграю с ним. Благодаря! – dsch

+1

Просто добавьте здесь, спасибо за подсказку AutoId. Он работает чудесно и чертовски много проще справиться. Еще раз спасибо – dsch

4

Альтернативой @ MtlDev Ответим будет использовать updateChildValues():

let data = ["CHANGED": String(text)] 
dataRef.updateChildValues(data) 

setValue() Хотя заменяет текущие данные с новым значением, updateChildValues() обновляет его на месте.

См. Firebase documentation on updating saved data.

+0

Это намного лучше, чем использование setValue, спасибо! – dsch

+0

Оба имеют свои прецеденты. Когда вы обновляете одно свойство, я обычно использую 'serValue()', потому что он предотвращает необходимость в словаре. При обновлении нескольких свойств (но все еще подмножество объекта) 'updateChildValue()' является вашим единственным и, следовательно, лучшим вариантом. :-) –

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