Я создаю приложение, в котором пользователь сначала проходит аутентификацию, а затем он может добавить запись о выловленной рыбе.
Когда пользователь создает учетную запись, он добавляется в раздел «Аутентификация» в 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)
}
}