2016-05-25 4 views
0

Эта проблема может быть трудно объяснить.Извлечение конкретных данных Firebase, которые хранятся в справочнике childByAutoId() (Swift)

Вот JSON, который генерируется firebase:

{ 
    "users" : { 
    "2W1Sse5kiZarFQ5k8UKjP87D8Rk2" : { 
     "PlainNote" : { 
     "-KIZYVAGZQczTSI1L4Qi" : { 
      "note" : "Finally works", 
      "title" : "Whats up" 
     }, 
     "-KIZY_M3FMW0m8mgx4Am" : { 
      "note" : "Aye", 
      "title" : "Db" 
     }, 
     "-KIZpAEsa7-wSCOJfHvv" : { 
      "note" : "This wont work for some reason", 
      "title" : "Helloo" 
     } 
     }, 
     "email" : "[email protected]" 
    }, 
    "XTjy66z8xEWtEiLx6E0mOo1JEaz2" : { 
     "email" : "[email protected]" 
    }, 
    "rfzV1saUf3RtPu7YcqJ0VyAOgmd2" : { 
     "PlainNote" : { 
     "-KIZpfbfHcePU3E8HpeU" : { 
      "note" : "Now i only see my own data", 
      "title" : "Hello" 
     } 
     }, 
     "email" : "[email protected]" 
    } 
    } 
} 

Вот как я произвожу каждую простую записку в скор:

let title = plainNoteTitleTextField.text! 
    let note = bodyOfNoteTextView.text! 
    let usersId = FIRAuth.auth()?.currentUser?.uid 

     if title != "" || note != "" { 
      let data = [ 
       "title": title, 
       "note": note 
      ] 

self.usersRef.child(usersId!).child("PlainNote").childByAutoId().setValue(data) 

После этого я заселить TableView в реальном времени с база данных с базой данных firebase:

override func viewDidAppear(animated: Bool) { 
    var localNotes = [String]() 
    var localBody = [String]() 
    let usersId = FIRAuth.auth()?.currentUser?.uid 
    usersRef.child(usersId!).child("PlainNote").observeEventType(.ChildAdded, withBlock: { snapshot in 
     let title = snapshot.value?.objectForKey("title") as! String 
     var x = snapshot.value?.objectForKey("note") as! String 

     if x.characters.count > 20 { 
      x = x[0...20] + "..." 
     } else { 
      x = x + "..." 
     } 

     localNotes.insert(title, atIndex: 0) 
     localBody.insert(x, atIndex: 0) 
     self.notes = localNotes 
     self.noteBody = localBody 
     self.tableView.reloadData() 
    }) 
} 

Моя проблема: я пытаюсь получить доступ к PlainNote Refer так что, когда ячейка tableview используется, я могу вытащить конкретное название и тело заметки из firebase. Я не уверен, как бы это сделать, не обращаясь к моей базе данных каждый раз, потому что firebase создает уникальную ссылку каждый раз при создании новой заметки.

(P.S .: Если вы считаете, что понимаете, но вам нужна более подробная информация, не стесняйтесь спрашивать!) Спасибо.

+0

Предполагая, что вы используете массив в качестве источника данных для вашего вида таблицы; если в настольном представлении в настоящее время показаны три узла из узла 2W1S ... когда пользователь вступает в красную строку 1 (Aye), почему вы можете просто получить информацию о заметке из массива [index = 1]? Необязательно, если пользователь забирает строку -KIZY_M3, вы можете использовать NSPredicate для поиска массива для -KIZY_M3. – Jay

ответ

1

не уверен, что у вас есть ответ, но вот он на всякий случай (у меня была такая же проблема). Я понимаю, что вы хотите получить уникальные ключи, которые генерируются каждый раз, чтобы вы могли получить доступ к данным, хранящимся под одним. Вы можете создать строковый массив, а затем использовать его для извлечения значения ключа по одному индексу, который затем может быть возвращен обратно в код поиска данных. Это делается так:

usersRef.child(usersId!).child("PlainNote").observeEventType(.ChildAdded, withBlock: { snapshot in 

var idKeys = [String]() //this will hold your keys 

for snap in snapshot.children.allObjects { 

let id = snap as! FIRDataSnapshot 

idKeys.append(String(id.key)) 

}} 

Теперь у вас есть ключи, вы можете выбрать один с помощью вар selectedKey = idKeys [х].

Надеюсь, что это поможет

+0

Я действительно сделал это точно ... Но я ценю ответ! – JacobSiegel

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