Попытка добавить объекты в класс и сохранить информацию в базе данных Firebase - PullRequest
1 голос
/ 17 июня 2019

Я хочу сохранить новые объекты через контроллер представления в моем приложении. Однако я хочу, чтобы эти новые объекты загружались при входе в приложение. Я использую Firebase для сохранения данных в базе данных, но как я могу сохранить объект и вернуть его при повторном входе в приложение? Я новичок в программировании, извините за возможную путаницу.

Здесь информация о цели читается после входа в приложение.

for i in 0 ... clientList.count - 1 {

screenHandle = ref?.child(organizationCode).child(clientList[i].name).observe(.value, with: { (snapshot) in
    let clientStuffLoad = snapshot.value as! [String:Any]

    if clientStuffLoad["Goal 1 Description"] != nil {
        clientList[i].goal1 = clientStuffLoad["Goal 1"] as! String
    } else {
        clientList[i].goal1 = ""
    }

По сути, это то, что я имею в виду добавления нового члена в класс Client:

@IBAction func addingClientSaveButton(_ sender: Any) {


        var client7 = Client(name: addingClientName.text!, 
                      goal1: addingClientGoal1.text!, goal2: 
                      addingClientGoal2.text!, 
                      goal3: addingClientGoal3.text!, 
                      isSelected: false, s: 1, 
                      ind: 1, targetBehavior1 : addingClientTB1.text!, 
                      targetBehavior2 : addingClientTB2.text!, 
                      targetBehavior3 : addingClientTB3.text!, 
                      targetBehavior1Info : addingClientTB1Info.text!, 
                      targetBehavior2Info : addingClientTB2Info.text!, 
                      targetBehavior3Info : addingClientTB3Info.text!)

но я бы хотел, чтобы имя объекта считывало ввод имени клиента, а не client7

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

1 Ответ

0 голосов
/ 18 июня 2019

Это очень широкий вопрос, потому что он охватывает множество различных аспектов работы с Firebase;написание, чтение, обработка DataSnapshots и т. д. Кроме того, я не знаю, что представляют ваши данные, поэтому я выбрал кое-что для себя, чтобы охватить некоторые аспекты работы с Firebase.

Там нет проверки ошибок, но она работает какявляется.Я прокомментировал по пути.

У Firebase нет объектов;просто родительский и дочерний узлы.Все можно рассматривать как пары ключ: значение, как словарь.Вы не можете написать объект или прочитать объект.Только NSString, NSNumber, NSDictionary и страшный NSArray (или их аналоги Swift)

Давайте начнем с класса - есть 100 способов сделать это, но мне нравится, когда классы отвечают за свои свойства, а также принимают их ипредставив их

class WineClass {
    var wine_key = ""
    var name = ""
    var varietal = ""

    //this is used when creating a new wine object before storing in firebase
    init(withName: String, andVarietal: String) {
        self.name = withName
        self.varietal = andVarietal
    }

    //this is used when we are loading data from firebase to create the wineclass object
    init(withSnapshot: DataSnapshot) {
        let wineName = withSnapshot.childSnapshot(forPath: "wine_name").value as? String ?? "No Wine Name"

        let wineDict = withSnapshot.value as! [String: Any]
        let wineVarietal = wineDict["wine_varietal"] as? String ?? "No Wine Varietal"

        self.wine_key = withSnapshot.key //when we read a wine, this will be it's reference in case we want to update or delete it
        self.name = wineName
        self.varietal = wineVarietal
    }

    //this is use to create a dictionary of key:value pairs to be written to firebase
    func getWineDictForFirebase() -> [String: Any] {
        let d = [
            "wine_name": self.name,
            "wine_varietal": self.varietal
        ]

        return d
    }
}

Затем нам нужен класс var для хранения WineClass's.Это может быть, например, источник данных для tableView

var wineArray = [WineClass]() //a class var array to store my wines

Затем я дам вам две кнопки: одну, которая заполняет и записывает немного вина в Firebase, а затем вторую, которая читает их и выводит на консоль * 1013.*

func button0() {
    self.writeWine(withName: "Scarecrow", andVarietal: "Red Blend")
    self.writeWine(withName: "Ghost Horse", andVarietal: "Cabernet Sauvignon")
    self.writeWine(withName: "Screaming Eagle", andVarietal: "Cabernet Sauvignon, Merlot, Cabernet Franc")
}

func button1() {
    self.readWines()
}

И затем функция, которая принимает некоторые строки как свойства для каждого вина и записывает их в Firebase

func writeWine(withName: String, andVarietal: String) {
   let newWine = WineClass(withName: withName, andVarietal: andVarietal) //create a new wine object

   let wineListRef = self.ref.child("wine_list") //get a reference to my firebase wine_list
   let thisWineRef = wineListRef.childByAutoId() //a new node for this wine
   let d = newWine.getWineDictForFirebase() //get the wine properties as a dictionary
   thisWineRef.setValue(d) //save it in firebase
}

и, наконец, функцию, которая читает эти вина и печатает их свойства в консоли

func readWines() {
   let wineRef = self.ref.child("wine_list")
   wineRef.observeSingleEvent(of: .value, with: { snapshot in //we are reading in the entire wine node which will contain many child nodes
       let allWines = snapshot.children.allObjects as! [DataSnapshot] //cast each child node as a DataSnapshot & store in array
       for wineSnap in allWines { //iterate over each child node in the array
           let wine = WineClass(withSnapshot: wineSnap) //create a new wine, ensuring we also keep track of it's key
           self.wineArray.append(wine) //add to the array
       }

       for wine in self.wineArray  {
           print(wine.wine_key, wine.name, wine.varietal)
       }
   })
}

и, наконец, при нажатии кнопки 0 наша Firebase выглядит следующим образом

wine_list
   -LhbjhkEC8o9TUISCjdw
      wine_name: "Scarecrow"
      wine_varietal: "Red Blend"
   -LhbjhkEC8o9TUISCjdx
      wine_name: "Ghost Horse"
      wine_varietal: "Cabernet Sauvignon"
   -LhbjhkEC8o9TUISCjdy
      wine_name: "Screaming Eagle"
      wine_varietal: "Cabernet Sauvignon, Merlot, Cabernet Franc"

, а затем вывод при нажатии кнопки 1

-LhbjhkEC8o9TUISCjdw Scarecrow Red Blend
-LhbjhkEC8o9TUISCjdx Ghost Horse Cabernet Sauvignon
-LhbjhkEC8o9TUISCjdy Screaming Eagle Cabernet Sauvignon, Merlot, Cabernet Franc

Обратите внимание, что само.ref - это ссылка на корневой узел моей базы Firebase , ваша ссылка должна ссылаться на вашу базу FireBase.

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