【问题标题】:Read Data for the current user?读取当前用户的数据?
【发布时间】:2019-07-15 19:14:33
【问题描述】:

您好,我想知道如何读取当前登录用户的数据以及如何检索数据。 updateName 函数的第一个代码在另一个 viewController 中。函数 updateName 在另一个 ViewController 中。 我将数据放在“用户”下,然后在 Firebase RealTimeDatabse 中有两个名为 Firstname = SomeData、LastName = SomeData 的键值对,如何访问当前登录用户的唯一数据。 我更新了代码以给予信用是所谓的坦率, 问题是它不会将数据读入其中并给出空值,我知道为什么,因为由于用户正在创建用户帐户,因此 uid 为空。 那么当用户创建帐户时如何保存用户名并为其配置文件回调 你能帮我么 提前感谢您的帮助

        let nameDB = Database.database().reference().child("User")
    let nameDictionary = ["FirstName" : fullName.text!, "LastName" : lastName.text!]   
    let uid = Auth.auth().currentUser?.uid
    Auth.auth().createUser(withEmail: email.text!, password: password1) { (userInformation, someKindOfError) in

            if someKindOfError != nil {
                print(someKindOfError!)
            } else {
                //success

             nameDB.child(uid!).setValue(nameDictionary) {
                    //error 
                    (error, reference) in
                    if error != nil{
                        print(error!)
                    } else  {
                        print("Name saved Sucessful")

                    }
                }
                print("Registration successful!!")

            }
        }

   //Different viewController
   func updateName() {

    let userID = Auth.auth().currentUser?.uid

    let fullName = Database.database().reference().child("User").child(userID!)



    fullName.observeSingleEvent(of: .value) { (snapShot) in

       print("Enter snapShot")
        if let snapShotValue = snapShot.value as? [String : String]{

            print("Entering to grab the data")
            let first = snapShotValue["FirstName"] //as? String
            let last =  snapShotValue["LastName"] //as? String
            print(first, last)

            self.fullName.text = "\(first) \(last)"

        }
    }

数据结构:

 {
"User" : {
"fTKigbhqdVfis9SFk7ofsq1k9Gw1" : {
  "FirstName" : "Alfred",
  "LastName" : "case"
}
 }

 }

【问题讨论】:

  • 代码乍一看还不错。有什么不好的?具体来说:哪条线路没有按照您的预期执行?另请注意,如果您的问题包含您正在阅读的 JSON(作为文本,请不要截图),这将很有用。您可以通过单击 Firebase Database console 的溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。
  • 它说 snapShotValue = snapShot.value as...整个事情并没有按照我是 firebase 的新手的方式执行,我想获取当前用户的名字和姓氏
  • 你是如何确定它不执行的?请注意,数据是异步加载的,因此您无法使用调试器单步执行该回调。而是在if let snapShotValue 行上设置断点以查看它是否被命中,或者在其前面放置一个print
  • 我做了,没有打印出来,如果我取出 .child(userID!) 然后打印 nil nil
  • 请将您的信息直接添加到您的问题中。我现在为你做了,但它下面有一个编辑链接,你以后可以点击。下一步:不要伪造任何数据,但要准确显示您当前拥有的无效数据。 "numbersHereGeneratedbyFirebaseJustPlacedWordForIt" 并不是真正存在的,这让我们很难确定您是否正确应用了我的答案中的更改。不要担心共享推送 ID 的 UID,因为它们都不是安全凭证。它们只是用于共享的标识符。

标签: ios swift firebase firebase-realtime-database firebase-authentication


【解决方案1】:

您正在为这样的用户编写数据:

let nameDB = Database.database().reference().child("User")
nameDB.childByAutoId().setValue(nameDictionary)

然后你用这个来阅读它:

let fullName = Database.database().reference().child("User").child(userID!)
fullName.observeSingleEvent(of: .value) { (snapShot
  ...

如果您仔细观察,路径会有所不同。你给/User/$autoId写信,从/User/$uid读。用户的 UID 与 childByAutoId 生成的 ID 不同。

你可能想写信给:

let nameDB = Database.database().reference().child("User")
let uid = Auth.auth().currentUser?.uid
nameDB.child(uid).setValue(nameDictionary)

【讨论】:

  • 把这个 nameDB.child(uid!).setValue(nameDictionary) { //error 和保存的数据的引用(错误,引用)放在 if error != nil{ print(error!) } else { print("名称保存成功") } }
  • 感谢您帮助我:)
  • 是的,您的代码看起来不错。我刚刚从我的答案中删除了完成处理程序以保持简短。
  • 但是还是不显示名字和姓氏
  • 嘿@frank 上面写着 nameDB.child(uid!).setValue(nameDictionary) 我把它放在用户可以注册应用程序的地方,当用户点击创建按钮然后显示这里有错误,为什么会这样?
猜你喜欢
  • 1970-01-01
  • 2021-03-05
  • 2019-04-05
  • 1970-01-01
  • 2020-02-21
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
相关资源
最近更新 更多