文档路径SwiftUI中随机生成的Firebase子键

Posted

技术标签:

【中文标题】文档路径SwiftUI中随机生成的Firebase子键【英文标题】:Randomly generated Firebase child key in document path SwiftUI 【发布时间】:2020-11-10 14:13:35 【问题描述】:

我环顾四周,虽然有一些相似的答案,但我找不到我特别要找的东西。

我的数据存储在 Firebase (Cloud Firestore) 中,我需要读回该数据,这很好并且可以正常工作。我的问题是我更改了文档文件路径的设置,通过在文件路径中添加随机生成的 id 来进一步提高安全性。

首先,这是否可以将通配符添加到 Xcode 中的文档路径中?其次,这可以作为一个字符串来完成吗?

我已经添加了下面的代码,包括文件路径。

提前致谢。

class getContactData : ObservableObject
    
    @Published var datas = [contactDataType]()
    @AppStorage("selectedSchool") var selectedSchool: String = "selectedSchool"
    
    init() 
        
        let db = Firestore.firestore()
        
        db.collection("/School Name/\(selectedSchool)/School Assets/**randomPath**/Contact Details").getDocuments  (snap, err) in
            
            if err != nil
                
                print((err?.localizedDescription)!)
                return
            
            
            for i in snap!.documents
                
                let id = i.documentID
                let adno = i.get("ID") as! String
                let fullname = i.get("Full Name") as! String
                let firstname = i.get("First Name") as! String
                let lastname = i.get("Last Name") as! String
                let registrationgroup = i.get("Registration Group") as! String
                let priority1relation = i.get("Priority 1 Relation") as! String
                let priority1fullname = i.get("Priority 1 Full Name") as! String
                let priority1maintelephone = i.get("Priority 1 Main Telephone") as! String
                let priority1mobile = i.get("Priority 1 Mobile") as! String
                let priority2relation = i.get("Priority 2 Relation") as! String
                let priority2fullname = i.get("Priority 2 Full Name") as! String
                let priority2maintelephone = i.get("Priority 2 Main Telephone") as! String
                let priority2mobile = i.get("Priority 2 Mobile") as! String
                let priority3relation = i.get("Priority 3 Relation") as! String
                let priority3fullname = i.get("Priority 3 Full Name") as! String
                let priority3maintelephone = i.get("Priority 3 Main Telephone") as! String
                let priority3mobile = i.get("Priority 3 Mobile") as! String
                let priority4relation = i.get("Priority 4 Relation") as! String
                let priority4fullname = i.get("Priority 4 Full Name") as! String
                let priority4maintelephone = i.get("Priority 4 Main Telephone") as! String
                let priority4mobile = i.get("Priority 4 Mobile") as! String
                
                
                self.datas.append(contactDataType(id: id, adno: adno, fullname: fullname, firstname: firstname, lastname: lastname, registrationgroup: registrationgroup, priority1relation: priority1relation, priority1fullname: priority1fullname, priority1maintelephone: priority1maintelephone, priority1mobile: priority1mobile, priority2relation: priority2relation, priority2fullname: priority2fullname, priority2maintelephone: priority2maintelephone, priority2mobile: priority2mobile, priority3relation: priority3relation, priority3fullname: priority3fullname, priority3maintelephone: priority3maintelephone, priority3mobile: priority3mobile, priority4relation: priority4relation, priority4fullname: priority4fullname, priority4maintelephone: priority4maintelephone, priority4mobile: priority4mobile))
            
        
    


struct contactDataType : Identifiable 
    
    var id : String
    var adno : String
    var fullname : String
    var firstname : String
    var lastname : String
    var registrationgroup : String
    var priority1relation : String
    var priority1fullname : String
    var priority1maintelephone : String
    var priority1mobile : String
    var priority2relation : String
    var priority2fullname : String
    var priority2maintelephone : String
    var priority2mobile : String
    var priority3relation : String
    var priority3fullname : String
    var priority3maintelephone : String
    var priority3mobile : String
    var priority4relation : String
    var priority4fullname : String
    var priority4maintelephone : String
    var priority4mobile : String

【问题讨论】:

只需几个 cmets:查看 Firebase 的 Codable 支持 - 这将使将文档映射到应用程序的数据结构变得更加容易且不易出错:peterfriese.dev/swiftui-firebase-codable。此外,类名应以大写字母开头(请参阅google.github.io/swift)。我还建议不要在类名中使用动词。考虑使用ContactsStoreContactsRepository 而不是getConatctData。最后但并非最不重要的一点 - 避免使用 Swift 的 force unwrap 运算符。 通过默默无闻的方法来保护您的安全:这根本不会让事情变得更安全。相反,您应该实施适当的安全规则以确保您的数据安全:firebase.google.com/docs/firestore/security/get-started 嗨,彼得,感谢您提供的信息!这是我的第一个应用程序,所以绝对是一个巨大的学习曲线。我会研究可编码的,我已经在努力展开力,因为我知道经过更深入的研究后它并不好。我已经实施了安全规则,而且从上传的角度来看,它们运行良好,因此我可以从学校上传,而不会篡改上传到另一个文档的路径(如果这有意义的话)。 可编码是前进的方向!谢谢@Peter Friese 【参考方案1】:

在 Firebase 中,如果您添加一个新的 .document() 而不指定文档的名称,它将创建一个具有随机生成 ID 的文档。这不是通配符,而是随机路径。

    let firstCollection = "School Name"
    let selectedSchool = "Selected School"
    let secondCollection = "School Assets"
    let thirdCollection = "Contact Details"
    
    // Adding a document:
    let newDocument = db.collection(firstCollection).document(selectedSchool).collection(secondCollection).document()
    let randomPath = newDocument.documentID // You will need to store this if you need to access it directly later
    let finalPath = newDocument.collection(thirdCollection)
    finalPath.addDocument(data: ["info" : "info"], completion: nil)
    

附注:最好将数据库中的集合和文档的名称保持小写且不包含空格,以避免键入字符串错误(“学校名称”->“学校名称”)。

【讨论】:

您好,尼克,感谢您的回复。是的,我不是从客户端添加文档,而是从字面上阅读已经存在的文档。它允许应用从包含随机 ID 的数据库中读取查询【参考方案2】:

Firestore 不支持查询中的通配符。

如果您想查询数据库中所有名为“Contact Details”的子集合中的所有文档,则可以使用collection group query。

db.collectionGroup("Contact Details").getDocuments  (snap, err) in
    // ...

【讨论】:

谢谢道格,我试试看!谢谢

以上是关于文档路径SwiftUI中随机生成的Firebase子键的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 将存储中图像文件的路径移动到 Firebase 上的实时数据库 [重复]

SwiftUI Firebase - 如何查询文档然后更新?

获取嵌套数组 Firebase + SwiftUI

Firebase SwiftUI 和 Firebase Auth - 不读取用户 ID?

Firebase+SwiftUI。无法转换价值

SWIFTUI Firebase 检索子集合数据