文档路径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)。我还建议不要在类名中使用动词。考虑使用ContactsStore
或ContactsRepository
而不是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 - 如何查询文档然后更新?