(child :)必须是非空字符串且不包含'。' '#' ' $' ' ['或者']''

时间:2017-09-19 14:48:09

标签: ios firebase swift3

您好我正在使用Firebase和Swift3构建我的应用程序,但是当我运行代码时出现此错误"(child :)必须是非空字符串且不包含'。 ' '#' ' $' ' ['或']''" 。这是我得到错误的函数,即使一切都应该工作

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print (self.otherUserUid)
    let reference = Database.database().reference().child("User-messages").child(Auth.auth().currentUser!.uid).child(self.otherUserUid).queryLimited(toLast: 51)
    reference.observeSingleEvent(of: .value, with: {[weak self] (snapshot) in
        print("IN")
        let messages = Array(JSON(snapshot.value as Any).dictionaryValue.values).sorted(by: { (lhs, rhs) -> Bool in
            return lhs["date"].doubleValue < rhs["date"].doubleValue

        })
        let converted = self!.convertToChatItemProtocol(messages: messages)
        if converted.isEmpty == true {
            print ("empty")
        }
        let navcontroller = segue.destination as! UINavigationController
        let chatlog = navcontroller.topViewController as! ChatLogController
        chatlog.userUID = self.otherUserUid
        chatlog.dataSource = DataSource(initialMessages: converted ,uid: (self?.UIDLabel.text)!)
        chatlog.MessagesArray = FUIArray(query: Database.database().reference().child("User-messages").child(Me.uid).child((self?.UIDLabel.text)!).queryStarting(atValue: nil, childKey: converted.last?.uid), delegate: nil)


        messages.filter({ (message) -> Bool in
            return message["type"].stringValue == PhotoModel.chatItemType
        }).forEach({ (message) in
            self?.parseURLs(UID_URL: (key: message["uid"].stringValue, value: message["image"].stringValue))
        })

    })

}

应用程序在打印之前崩溃&#34; IN&#34;,但是当我打印self.otherUserUid时,它会返回正确的值。我也更新了豆荚,但它没有解决任何问题。 在此先感谢:)

解决方案:错误是我在ChatLogController的viewDidLoad中插入了一个func,当用户决定结束聊天时,另一个获取信息,但该func需要其他用户Uid,当视图加载时不是任何uid,因为它必须被传递,所以我将func插入&#34; viewDidAppear&#34;一切正常。感谢所有试图帮助我的人。

2 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为当涉及Firebase时,此符号'.' '#' '$' '[' or ']'是禁止的。 Firebase中的密钥不能包含任何此符号。因此,为了解决这个问题,您需要通过将这些符号替换为允许的其他符号来对这些字符串进行编码。例如,对于我重新发送的电子邮件地址,您可以进行此更改。

  

name@email.com - &gt;名@电子邮件,玉米

正如您可能看到的那样,我已将.(点)替换为,(逗号)。

答案 1 :(得分:0)

对我来说,问题是我将Double值强制转换为字符串。但是,当您对Double值更具体时,它们会包含一个点,例如“ 1234.56”,所以Firebase对我大喊。我用逗号“ 1234,56”替换了该小点,然后解决了。

要用逗号替换圆点,可以建议这篇文章:

https://stackoverflow.com/a/24201206/8165702