检索存储在 childByAutoId() 参考 (Swift) 中的特定 Firebase 数据

Posted

技术标签:

【中文标题】检索存储在 childByAutoId() 参考 (Swift) 中的特定 Firebase 数据【英文标题】:Retrieving specific Firebase data that is stored in a childByAutoId() Reference (Swift) 【发布时间】:2016-05-25 01:38:38 【问题描述】:

这个问题可能很难解释。

这是由 firebase 生成的 JSON:


  "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" : "jacobsiegel@gmail.com"
    ,
    "XTjy66z8xEWtEiLx6E0mOo1JEaz2" : 
      "email" : "123@gmail.com"
    ,
    "rfzV1saUf3RtPu7YcqJ0VyAOgmd2" : 
      "PlainNote" : 
        "-KIZpfbfHcePU3E8HpeU" : 
          "note" : "Now i only see my own data",
          "title" : "Hello"
        
      ,
      "email" : "whatsup@gmail.com"
    
  

以下是我如何快速生成每个普通笔记:

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)

在此之后,我使用 firebase 实时数据库实时填充 tableview:

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 引用,以便在点击 tableview 单元格时,我可以从 firebase 中提取特定的注释标题和正文。如果不每次都查看我的数据库,我不确定该怎么做,因为每次创建新笔记时,firebase 都会创建一个唯一的引用。

(P.S.:如果您认为您了解,但需要更多详细信息,请不要犹豫!) 谢谢。

【问题讨论】:

假设您使用数组作为表格视图的数据源;如果 tableview 当前显示来自节点 2W1S 的三个节点......当用户点击第 1 行(Aye)时,为什么只能从数组 [index = 1] 中获取注释信息?或者,如果用户点击行 -KIZY_M3,您可以使用 NSPredicate 在数组中搜索 -KIZY_M3。 【参考方案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))


现在你有了你的密钥,你可以使用 var selectedKey = idKeys[x] 选择一个。

希望对你有帮助

【讨论】:

我确实做到了...但我很感激你的回应!

以上是关于检索存储在 childByAutoId() 参考 (Swift) 中的特定 Firebase 数据的主要内容,如果未能解决你的问题,请参考以下文章

Firebase:从实时数据库中检索 childByAutoID

从 Firebase Auto Id 中检索数据 - Firebase Swift

使用 updateChildValues 更新 childByAutoId

Firebase 在 Swift 中检索低于自动 ID 的数据

如何快速从 childByAutoID() 获取密钥 [重复]

如何达到childByAutoId()背后的值