Добавление пользовательских данных в БД Firebase Realtime с iOS - PullRequest
0 голосов
/ 31 октября 2019

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

Когда пользователь создает учетную запись, он добавляется в раздел «Аутентификация» в Firebase и также добавляется к узлу «пользователи» в базе данных реального времени. Вот как выглядит запись авторизации:

func createUser(withEmail email: String, andPassword password: String, userCreationComplete: @escaping (_ status: Bool, _ error: Error?) -> ()) {
        Auth.auth().createUser(withEmail: email, password: password) { (authDataResult, error) in
            guard let authDataResult = authDataResult else {
                userCreationComplete(false, error)
                return
            }

            let userData = ["provider": authDataResult.user.providerID, "email": authDataResult.user.email]
            DataService.instance.createDbUser(uid: authDataResult.user.uid, userData: userData)
            userCreationComplete(true, nil)
        }
    }

private var _REF_BASE = DB_BASE
    private var _REF_USERS = DB_BASE.child("users")
    private var _REF_CATCHES = DB_BASE.child("catches")

func createDbUser(uid: String, userData: Dictionary<String, Any>) {
        REF_USERS.child(uid).updateChildValues(userData)
    }

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

У меня есть модель рыбы:

class Fish {
    private var _fishSpecies: String
    private var _fishWeight: String
    private var _key: String

    var fishSpecies: String {
        return _fishSpecies
    }
    var fishWeight: String {
        return _fishWeight
    }
    var key: String {
        return _key
    }

    init(species: String, weight: String, key: String) {
        self._fishSpecies = species
        self._fishWeight = weight
        self._key = key
    }
}

Это моя кнопка «Добавить», которая должна взять информацию о рыбе, добавленную пользователем, и добавить ее в базу данных реального времени вконкретный пользователь:

@IBAction func addBtnPressed(_ sender: Any) {
    guard let species = speciesTxtField.text
    guard let weight = weightTxtField.text 
    guard let uid = Auth.auth().currentUser?.uid

    //nest fish model in the realtime db under the specific user        
}

Чтобы сделать то, что должно делать мое приложение, мне также нужно будет обновить мои правила БД? В настоящее время они позволяют читать и писать любому, кто прошел проверку подлинности. Должны ли они быть изменены на разрешение только чтения, если uid совпадает?

{
  "rules": {
    "$uid": {
      ".write": "auth.uid != null",
      ".read": "auth.uid != null"
   }
 }
}

edit:

Вот метод в моем классе обслуживания данных, чтобы создать запись рыбы и получить все записи рыбы? Это выглядит правильно? Как бы я использовал это в своем действии кнопки «добавить»?

func createFish(withSpecies species: String, andWeight weight: String, handler: @escaping (_ fishCreated: Bool) -> ()) {
        REF_CATCHES.childByAutoId().updateChildValues(["species": species, "weight": weight])
        handler(true)
    }

func getAllFish(handler: @escaping (_ catchArray: [Fish]) -> ()) {
        var fishArray = [Fish]()
        REF_CATCHES.observeSingleEvent(of: .value) { (fishSnapshot) in
            guard let fishSnapshot = fishSnapshot.children.allObjects as? [DataSnapshot] else { return }
            for fish in fishSnapshot {
                    let species = fish.childSnapshot(forPath: "species").value as! String
                    let weight = fish.childSnapshot(forPath: "weight").value as! String
                    let cAtch = Fish(species: species, weight: weight, key: fish.key)
                    fishArray.append(cAtch)
            }
            handler(fishArray)
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...