【问题标题】:Changing from Firebase to Firestore caused Fatal error: Unexpectedly found nil ... in a query从 Firebase 更改为 Firestore 导致致命错误:Unexpectedly found nil ... in a query
【发布时间】:2018-09-09 16:37:30
【问题描述】:

在将我的数据从 firebase 迁移到那里后,我正在尝试从 firestore 检索用户的数据。下面的代码在 firebase 上运行良好,并检索了用户的数据。

但是,将查询更改为 firestore 查询后,出现此错误。

此处的打印语句“document.data()”包含数据,但出现此错误。我不知道这个错误来自哪里。

当我将 document.data() 与 nil 进行比较时,我得到“文档数据:包含 nil”。

我不知道我应该如何获取数据。

这是我得到错误的代码,

    static func getUser(uid: String, setUserDefaults: @escaping (NormalUser) -> Void){
   DataService.ds.REF_USERS_NORMAL.document(uid).getDocument { (document, error) in
        if error != nil{
            print("\(String(describing: error?.localizedDescription))")
        }else{
                if document != nil{
                    let data = document?.data() as! [String: String]
                   print("Document data: \(String(describing: document?.data() as! [String: String]))")
                    let user = NormalUser(userData: (data as Dictionary<String, AnyObject>))
                    setUserDefaults(user)
                }else{
                    print("Document data: contains nil")
                }
        }
    }
}

这是我定义变量的方式,

 import Foundation
 import Firebase

class NormalUser: User {

private var _email: String?
private var _city: String?
private var _country: String?
private var _name: String?
private var _phone: String?
private var _profileImgUrl: String?


var email: String {
    return _email!
}
var city: String {
    return _city!
}
var country: String {
    return _country!
}
var name: String {
    return _name!
}
var phone: String {
    return _phone!
}
var profileImgUrl: String {
    set{
        self.profileImgUrl = _profileImgUrl!
    }
    get{
        if let pI = _profileImgUrl{
            return pI
        }
        return ""
    }
}

init(userData: Dictionary<String, AnyObject>) {

    super.init(userId: userData["uid"] as! String, user: userData)

    if let email = userData["email"] as? String {
        self._email = email
    }
    if let city = userData["city"] as? String {
        self._city = city
    }
    if let country = userData["country"] as? String {
        self._country = country
    }
    if let name = userData["name"] as? String {
        self._name = name
    }
    if let phone = userData["phone"] as? String {
        self._phone = phone
    }
    if let profileImgUrl = userData["imgUrl"] as? String {
        self._profileImgUrl = profileImgUrl
    }
}

static func createNormalUser(uid: String, userData: Dictionary<String, String>) {
    // add user to database
    //DataService.ds.REF_USERS_NORMAL.child(uid).setValue(userData)
    DataService.ds.REF_USERS_NORMAL.document(uid).setData(userData) { (err) in
            if let err = err {
                print("Error writing document: \(err)")
            } else {
                print("Document successfully written!")
            }
    }

    addUserToGroup(uid:uid, group:"normal")
}

static func updateUserProfile(uid: String, userData: Dictionary<String, String>) {
    //DataService.ds.REF_USERS_NORMAL.child(uid).updateChildValues(userData)
   DataService.ds.REF_USERS_NORMAL.document(uid).updateData(userData)
}

static func getUser(uid: String, setUserDefaults: @escaping (NormalUser) -> Void){

   DataService.ds.REF_USERS_NORMAL.document(uid).getDocument { (document, error) in
        if error != nil{
            print("\(String(describing: error?.localizedDescription))")
        }else{
                if document != nil{
                    let data = document?.data() as! [String: String]
                   print("Document data: \(String(describing: document?.data() as! [String: String]))")
                    let user = NormalUser(userData: (data as Dictionary<String, AnyObject>))
                    setUserDefaults(user)
                }else{
                    print("Document data: contains nil")
                }
        }
    }
}

}

【问题讨论】:

标签: swift firebase google-cloud-firestore


【解决方案1】:

我解决了这个问题!

对于任何可能遇到此错误的人来说,问题出在 userId 上。我从firebase获取用户ID,在我的情况下,它不再为我的查询提供服务,最终得到一个零。当我直接通过身份验证获得 ID 时,

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

它解决了这个问题!

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2012-01-10
    相关资源
    最近更新 更多