创建事件后将信息推送到Firebase(Firebase-Realtime-Database)

时间:2019-06-18 20:55:59

标签: ios swift firebase firebase-realtime-database

我正在尝试创建一个应用,用户可以在其中查看事件列表,确定他们要加入的事件,单击该特定事件,然后将其加入。我要解决的部分是,创建活动的人希望查看哪些人加入了该活动。我知道如何获取人们的电子邮件,但不知道如何在特定事件中将其发送到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中进行

请让我知道是否需要澄清

2 个答案:

答案 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。