Хранение пользовательских объектов с массивом пользовательских объектов в Firebase: Swift

Для классов нового стиля используйте type(self), чтобы получить «текущий» класс:

def create_another(self):
    return type(self)()

Вы также можете использовать self.__class__, как это будет использовать значение type(), но использование метода API всегда рекомендуется.

Для классов старого стиля (python 2, не наследующих от object), type() не так полезен, поэтому вы вынуждены использовать self.__class__:

def create_another(self):
    return self.__class__()
1
задан pavpanda 8 March 2019 в 22:25
поделиться

1 ответ

Родитель не является объектом, который распознает Firebase, поэтому он выдает ошибку.

Руководство по Firebase Чтение и усиление. Запись данных показывает четыре типа объектов, которые могут быть записаны; Строка, число, словарь, массив.

Одно из решений - встроить в класс функцию, которая возвращает данные, которые вы хотите записать.

public class Parent {
    var phoneNumber: String?
    var familyKey: String?
    var geofences: [GeofenceData]?

    init() {
        self.phoneNumber = ""
        self.familyKey = ""
        self.geofences = nil
    }

    //other init functions

    func getParentDict() -> [String: Any] {

        let geoDict = ["name": name,
                       "latitude": latitude,
                       "longitude": longitude,
                       "radius": radius
        ]

        let zeroNode = ["0": geoDict]

        let dictForFirebase: [String: Any] = [
            "phoneNumber": phoneNumber,
            "familyKey": familyKey,
            "geofences": zeroNode
        ]

        return dictForFirebase
    }
}

и на практике

var tempGeofences = [GeofenceData]()
tempGeofences.append(GeofenceData(name: "Hello WOrld", latitude: 0, longitude: 0, radius: 1000))

let familyKey:String = String(Int.random(in: 1000...99999))
let uid:String = Auth.auth().currentUser!.uid
let phoneNumber = "1111111111"
let parent = Parent(phoneNumber: phoneNumber, familyKey: familyKey, geofences: tempGeofences)
let parentDict = parent.getParentDict
databaseRef.child(uid).setValue(parentDict)

Однако, одной проблемой является дочерний узел с «0» в качестве ключа. Похоже, вы можете использовать массив. Если есть хорошая причина, это хорошо, но обычно есть гораздо лучшие альтернативы использованию массивов в базах данных NoSQL. См. Устаревшую, но все еще точную публикацию Firebase под названием Arrays Are Evil

РЕДАКТИРОВАТЬ:

За комментарий / вопрос «Как добавить еще один дочерний узел после узла "0" "

Предположим, мы знаем, что родительский узел qSaEE ... позволяет добавить узел" 1 "

let parentNode = "qSaEE..."
let geofenceRef = firebaseRef.child(parentNode).child("geofences")

let geoDict = ["name": name,
               "latitude": latitude,
               "longitude": longitude,
               "radius": radius
               ]

let oneNode = ["1": geoDict]

geofenceNode.setValue(oneNode)
0
ответ дан Jay 8 March 2019 в 22:25
поделиться