我正在尝试创建一个应用,用户可以在其中查看事件列表,确定他们要加入的事件,单击该特定事件,然后将其加入。我要解决的部分是,创建活动的人希望查看哪些人加入了该活动。我知道如何获取人们的电子邮件,但不知道如何在特定事件中将其发送到Firebase。
这不使用Firestore
有人创建了一个事件: enter image description here
然后其他人在表格视图中看到该事件: enter image description here
然后,用户可以单击事件以获取更多信息: enter image description here
我现在想做的是当人们注册一个活动时,我想保存他们的电子邮件并将其发送到firebase,它将成为该活动的一部分: enter image description here
为进一步说明,这是我用来将事件详细信息推送到firebase的代码:
@IBAction func registerEvent(_ sender: UIButton) {
//push stuff to firebase
let eventName = eventTitle.text!
let eventDB = Database.database().reference().child("Events")
let eventDict = ["EventTitle": eventTitle.text!, "numPeople": numberOfPeople.text!, "EventDescription": EventDescription.text!]
eventDB.child(eventName).setValue(eventDict){
(error, reference) in
if(error != nil){
print(error!)
}
}
}
我需要将注册事件的用户的电子邮件推送到Firebase数据库,但是此操作需要在其他ViewController中进行
请让我知道是否需要澄清
答案 0 :(得分:3)
有两种不同的方法可以做到这一点,这实际上取决于您是使用实时数据库还是使用Firestore。以下信息将使用Firestore。
第一个:配置数据库并创建要发布的事件的路径。
// Create a path to the events DB
let eventsDB = Firestore.firestore().collection("events")
// It is helpful to initialize your object with an id that way you can get it later
let eventID = eventsDB.document().documentID
// Initialize your event with the eventID as an identifier
let event = Event(id: eventID, etc.....)
2nd:将数据发布到firestore
// Turn your event into a dictionary
// Your class or struct should have a data representation
let eventData = event.jsonRepresentation
// Create a path to prepare to publish to firestore
let path = Firestore.firestore().collection("users").document(id)
// Set the data
path.setData(value) { (error) in
if let error = error {
// There was an error handle it here
return
}
// Anything passed this points means the data has been set
}
现在,当您获取并序列化数据时,可以访问identifier属性并更新该特定文档。假设您的活动有参加者来存储其Firebase uid,那么您可以根据构建用户模型的方式引用其信息。
第3步:更新活动,如果您的活动没有出席属性,请创建该活动。还可以在此处签出firebase交易。我不会在这里使用它,但这是一个很好的资源。 https://firebase.google.com/docs/firestore/manage-data/transactions#transactions
// Append the new attending user to the old event
let newEvent = event.attendees.append("some_unique_id_goes_here")
// Create a path
let path = firestore.firestore().collection("events").document(newEvent.identifer)
// Update the document at that path
dbPath.setData([attendingKey: newEvent.attendees], merge: true) { (error) in
if let e = error {
// There was an error handle it here
return
}
// It was updated successfully
}
答案 1 :(得分:1)
问题有点模糊,但是第一个问题是使用事件名称作为事件的documentID(键)。从表面上看,这似乎是个好主意,但由于无法更改documentID(键),最终将难以维护且难以更改。例如,如果您为事件命名
Forth Of July Big Bash
然后几天后,您决定将其更改为
Forth Of July Big Bash 2019
不能。您将必须读入节点,删除现有节点,然后将其重写。此外,数据库中引用该节点的每个其他位置也都必须读入,删除和读出。
此结构是一个灵活的选择
Events //collection
document_0 //a document within the collection
event_name: "My Event"
num_people: 10
event_date: "20190704"
registration //a collection
doc_0:
email: some email
doc_1:
email: another email
现在,您可以更改事件名称,它对查询会更好。最好将documentID与它们包含的数据关联起来。
现在回答问题;
Firestore文档都有一个documentID,这就是用来从另一个文档中唯一识别一个文档的方法。在读取事件时,您希望在类或结构内以及其余字段中跟踪该documentID。
例如-假设我们具有上述结构的事件存储在Firestore中,并且这些事件显示在tableView中。您可能有一个类,用于存储从Firestore读取的每个事件,并具有一个var数组类,该类用作您的tableView的数据源。
class EventClass { //this is the class that holds the events for the array
var eventDocumentId = ""
var eventName = ""
var eventDate = ""
var numPeople = ""
}
class ViewController: NSViewController {
var myEventArray = [EventClass]()
func createEvent() {
let eventCollection = self.db.collection("Events")
let eventName = "July 4th Big Bash"
let eventDate = "20190704"
let numPeople = "10"
let eventDict = [
"event_name": eventName,
"event_date": eventDate,
"num_people": numPeople
]
//if there's an observer for the Event collection, this would fire
// passing in this event so an EventClass could be created
// and then added to the tableView dataSource.
eventCollection.addDocument(data: eventDict)
}
func readEvents() {
//Read events and populate the myEventArray with EventClasses
//As each event is read in, create an EventClass and populate it
// from the Firestore fields and also it's .documentID
}
func addAttendee() {
let email = "test@thing.com" //attendee email address
let docId = "cP3lXY5htLRqMGDZckv5" //get the documentID of the tapped event
let eventCollection = self.db.collection("Events")
let eventRef = eventCollection.document(docId)
let registrationRef = eventRef.collection("registration")
let dict = [
"email":email
]
registrationRef.addDocument(data: dict)
}
一般概念是,当用户点击tableView中的第3行时,您的应用通过读取dataSource数组中第3行(即EventClass)中的元素对此做出响应。从那里,从该EventClass获取documentID并将与会者添加到Firestore。