Post

Replies

Boosts

Views

Activity

Swift load (MySql) from server
Hello, I need help reading the data from my MySQL database. I would like to have the data read out in a loop and later add it to the NavigationView > List. Can someone point out my mistakes here? Or am I on the wrong track here? Or is there another way to read data from a database? I have an API file on my server (no Localhost) <?php // Create connection $con=mysqli_connect("my-mysql-domain.com","usernmae","password","database"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } // This SQL statement selects ALL from the table 'Locations' $sql = "SELECT * FROM Tablename"; // Check if there are results if ($result = mysqli_query($con, $sql)) { // If so, then create a results array and a temporary one // to hold the data $resultArray = array(); $tempArray = array(); // Loop through each row in the result set while($row = $result->fetch_object()) { // Add each row into our results array $tempArray = $row; array_push($resultArray, $tempArray); } // Finally, encode the array to JSON and output the results echo json_encode($resultArray); } // Close connections mysqli_close($con); ?> my php gives me the following output: [{"id":"1","nachname":"Tester Name","vorname":"Tester Vorname","nummer":"123","mail":"muster@meinedomain.de","adresse":"Musterstrasse","plz":"12345","ort":"Ortname","title":"Beispieltitle","post":"Hier der Inhalt"},{"id":"2","nachname":"Smith","vorname":"Jin","nummer":"567","mail":"no mail","adresse":"Street","plz":"12345","ort":"Berlin","title":"","post":""}] now to the Swift: Swift-File StockModel.swift import UIKit import SwiftUI class StockModel: NSObject, ObservableObject { //properties of a stock var id: String? var nachname: String? var vorname: String? var nummer: String? var mail: String? var adresse: String? var plz: String? var ort: String? var title: String? var post: String? //empty constructor override init() { } //construct with @nachname and @vorname parameters init(id: String, nachname: String, vorname: String, nummer: String, mail: String, adresse: String, plz: String, ort: String, title: String, post: String) { self.id = id self.nachname = nachname self.vorname = vorname self.nummer = nummer self.mail = mail self.adresse = adresse self.plz = plz self.ort = ort self.title = title self.post = post } //prints a stock's name and price override var description: String { return "Nachname: \(String(describing: nachname)), Vorname: \(String(describing: vorname))" } } Swift-File FeedModel.swift import UIKit import SwiftUI /* protocol FeedModelProtocol: class { func itemsDownloaded(items: NSArray) } */ protocol FeedModelProtocol: AnyObject { func itemsDownloaded(items: NSArray) } class FeedModel: NSObject, URLSessionDataDelegate, ObservableObject { @Published var fcdmember: [StockModel] = [] weak var delegate: FeedModelProtocol! let urlPath = "https://my-domain.com/api/stock_service.php" func downloadItems() { let url: URL = URL(string: urlPath)! let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default) let task = defaultSession.dataTask(with: url) { (data, response, error) in if error != nil { print("Error") }else { print("stocks downloaded") //self.parseJSON(data!) parseJSON(data!) } } task.resume() } } func parseJSON(_ data:Data) { var jsonResult = NSArray() do{ jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray } catch let error as NSError { print(error) } var jsonElement = NSDictionary() let stocks = NSMutableArray() for i in 0 ..< jsonResult.count { jsonElement = jsonResult[i] as! NSDictionary let stock = StockModel() //the following insures none of the JsonElement values are nil through optional binding if let name = jsonElement["name"] as? String, let price = jsonElement["price"] as? String { print(name) print(price) stock.name = name stock.price = price } stocks.add(stock) } DispatchQueue.main.async(execute: { () -> Void in //the following insures none of the JsonElement values are nil through optional binding if let id = jsonElement["id"] as? String, let nachname = jsonElement["nachname"] as? String, let vorname = jsonElement["vorname"] as? String, let nummer = jsonElement["nummer"] as? String, let mail = jsonElement["mail"] as? String, let adresse = jsonElement["adresse"] as? String, let plz = jsonElement["plz"] as? String, let ort = jsonElement["ort"] as? String, let title = jsonElement["title"] as? String, let post = jsonElement["post"] as? String { stock.id = id stock.nachname = nachname stock.vorname = vorname stock.nummer = nummer stock.mail = mail stock.adresse = adresse stock.plz = plz stock.ort = ort stock.title = title stock.post = post } stocks.add(stock) } DispatchQueue.main.async(execute: { () -> Void in //self.delegate.itemsDownloaded(items: stocks) }) } Swift-File ContentView.swift import UIKit import Foundation struct ContentView: View { @State private var ausgabe = StockModel() var body: some View { VStack { ForEach(ausgabe, id: \.self) { item in Text("Your name is \(ausgabe).") } } .padding() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
0
0
347
Aug ’23