Передача информации в firebase после создания события (Firebase-Realtime-Database) - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь создать приложение, в котором пользователь может просмотреть список событий, решить, к какому из них он хочет присоединиться, щелкнуть по этому конкретному событию, а затем присоединиться к нему.Часть, которую я пытаюсь решить, состоит в том, что человек, который создает событие, хочет видеть, какие люди присоединились к нему.Я знаю, как получить электронное письмо от людей, но не знаю, как подтолкнуть его к базе данных в этом конкретном событии.

Это не использует Firestore

Кто-то создает событие: введите изображениеописание здесь

Затем другие люди видят это событие в виде таблицы: введите описание изображения здесь

Затем пользователь может нажать на событие, чтобы получить больше информации: введите описание изображения здесь

То, что я хочу сделать сейчас, - это когда люди регистрируются на событие, я хочу сохранить их электронную почту и отправить ее в базу данных, где она будет частью этогоevent: введите описание изображения здесь

Для дальнейшего пояснения, это код, который я использую для передачи подробностей событий в базу:

@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 ]

3 голосов
/ 19 июня 2019

Есть несколько разных способов сделать это, и это действительно зависит от того, используете ли вы базу данных реального времени или Firestore.Следующая информация будет использовать Firestore.

1-й: Настройте базу данных и создайте путь для ваших событий для публикации.

// 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.....)

2-й: Публикуйте данные в 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
}

Теперь, когда выПолучить и сериализовать ваши данные вы можете получить доступ к свойству идентификатора и обновить этот конкретный документ.Предполагая, что у вашего мероприятия есть посетители, которые хранят свои идентификаторы базы данных, вы можете ссылаться на их информацию в зависимости от того, как вы строите модель User.

Шаг 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 голос
/ 20 июня 2019

Вопрос немного расплывчат, но первая проблема заключается в использовании имени события в качестве идентификатора документа (ключа) для события. Хотя на первый взгляд это кажется хорошей идеей, в конечном итоге ее будет сложно поддерживать и трудно изменить, потому что 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

Теперь вы можете изменить имя события и будет намного лучше для запросов. Часто хорошей идеей является отключение идентификаторов документов от содержащихся в них данных.

Теперь, чтобы ответить на вопрос;

Все документы Firestore имеют идентификатор документа, который используется для уникальной идентификации одного документа из другого. При чтении в событиях вы хотите отслеживать этот идентификатор документа в классе или структуре вместе с остальными полями.

Например - предположим, у нас есть события, хранящиеся в нашем Firestore с вышеуказанной структурой, и они отображаются в табличном представлении. У вас может быть класс, который хранит каждое событие при его чтении из Firestore, и массив var class, который используется в качестве источника данных для вашего 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)
   }

Общая концепция заключается в том, что когда пользователь нажимает на строку 3 в tableView, ваше приложение реагирует на это, читая элемент в массиве dataSource в строке 3, который будет EventClass. Оттуда получите documentID из этого EventClass и добавьте участника в Firestore.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...