iOS
...
Data Objects
Operazioni CRUD in iOS con ParseSwift SDK
17 min
crud parse oggetti in ios introduzione memorizzare dati su parse è costruito attorno alla parse object parse object classe ogni parse object parse object contiene coppie chiave valore di dati compatibili con json questi dati sono senza schema, il che significa che non è necessario specificare in anticipo quali chiavi esistono su ogni parse object parse object puoi semplicemente impostare le coppie chiave valore che desideri e il nostro backend le memorizzerà puoi anche specificare i tipi di dati in base alle esigenze della tua applicazione e memorizzare tipi come numero numero , booleano booleano , stringa stringa , dataora dataora , lista lista , geopointers geopointers , e oggetto oggetto , codificandoli in json prima di salvarli parse supporta anche la memorizzazione e la query di dati relazionali utilizzando i tipi puntatori puntatori e relazioni relazioni in questa guida, imparerai come eseguire operazioni di base sui dati attraverso un'app di esempio crud (app lista todo), che ti mostrerà come creare, leggere, aggiornare e eliminare dati dal tuo database del server parse utilizzando il parseswift sdk parseswift sdk questo tutorial utilizza un'app di base creata in xcode 12 e ios 14 in qualsiasi momento, puoi accedere al progetto completo tramite i nostri repository github https //github com/templates back4app/ios crud to do list obiettivo per imparare a eseguire operazioni di base su database back4app utilizzando un'app todo come esempio requisiti per completare questo quickstart, hai bisogno di xcode un'app creata su back4app segui il https //www back4app com/docs/get started/new parse app per imparare a creare un'app parse su back4app nota segui il https //www back4app com/docs/ios/parse swift sdk per creare un progetto xcode collegato a back4app comprendere la nostra app to do list per comprendere meglio il parseswift sdk parseswift sdk eseguirai operazioni crud su un'app to do list il database dell'applicazione avrà una semplice classe di attività con un titolo e una descrizione (entrambi stringhe stringhe ) puoi aggiornare il titolo e/o la descrizione di ciascuna attività riferimento rapido ai comandi che utilizzeremo una volta che un oggetto conforma il parseswift parseswift protocollo, implementa automaticamente un insieme di metodi che ti permetteranno di gestire l'oggetto e aggiornare eventuali modifiche nel tuo database back4app dato l'oggetto todolistitem todolistitem 1 struct todolistitem parseobject { 2 3 4 /// title for the todo item 5 var title string? 6 7 /// description for the todo item 8 var description string? 9 } questi metodi sono elencati di seguito create //once created an instance of todolistitem object and set its custom properties, you can save it on your back4app database by calling any of the following methods 1 var newitem todoilisttem 2 // newitem's properties 3 4 // saves newitem on your back4app database synchronously and returns the new saved item it throws and error if something went wrong 5 let saveditem = try? newitem save() 6 7 // saves newitem on your back4app database asynchronously, and passes a result\<todolistitem, parseerror> object to the completion block to handle the save proccess 8 newitem save { result in 9 // handle the result to check the save was successfull or not 10 } 11 read //for reading objects stored on your back4app database, todolistitem now provides the query() static method which returns a query\<todolistitem> this query object can be constructed using on or more queryconstraint objects int he following way 1 let query = todolistitem query() // a query to fetch all todolistitem items on your back4app database 2 let query = todolistitem query("title" == "some title") // a query to fetch all todolistitem items with title "some title" on your back4app database 3 let query = todolistitem query(\["title" == "some title", "description" = "ok"]) // a query to fetch all todolistitem items with title = "some title" and description = "ok" 4 5 // fetchs the items synchronously or throws an error if found 6 let fetcheditems = try? query find() 7 8 // fetchs the items asynchronously and calls a completion block passing a result object containing the result of the operation 9 query find { result in 10 // handle the result 11 } update //given the objectid of an object stored on you back4app database, you can update it in the following way 1 let itemtoupdate = todolistitem(objectid "oobject id") 2 // update the properites of itemtoupdate 3 4 // save changes synchronousty 5 itemtoupdate save() 6 7 // or save changes asynchronously 8 itemtoupdate save { result in 9 // handle the result 10 } delete //the deletion process is performed by calling the method delete() on the object to be deleted 1 var itemtodelete todolistitem 2 3 // delete itemtodelete synchronously 4 try? itemtodelete delete() 5 6 // delte itemtodelete asynchronously 7 itemtodelete delete { result in 8 // handleresult 9 } 1 crea un modello di app to do list in qualsiasi momento, puoi accedere al progetto completo tramite i nostri repository github https //github com/templates back4app/ios crud to do list vai su xcode e trova il scenedelegate swift scenedelegate swift file per aggiungere una barra di navigazione in cima all'app, impostiamo un uinavigationcontroller uinavigationcontroller come controller di vista radice nel seguente modo 1 class scenedelegate uiresponder, uiwindowscenedelegate { 2 3 var window uiwindow? 4 5 func scene( scene uiscene, willconnectto session uiscenesession, options connectionoptions uiscene connectionoptions) { 6 guard let scene = (scene as? uiwindowscene) else { return } 7 8 window = init(windowscene scene) 9 window? rootviewcontroller = uinavigationcontroller(rootviewcontroller todolistcontroller()) 10 window? makekeyandvisible() 11 12 // additional logic 13 } 14 15 16 } la classe del controller di vista radice ( todolistcontroller todolistcontroller ) per il controller di navigazione è una sottoclasse di uitableviewcontroller uitableviewcontroller , questo rende facile disporre un elenco di elementi 2 configura l'oggetto crud gli oggetti che desideri salvare nel tuo database back4app devono conformarsi al parseobject parseobject protocollo nella nostra app to do list, questo oggetto è todolistitem todolistitem pertanto, devi prima creare questo oggetto 1 import foundation 2 import parseswift 3 4 struct todolistitem parseobject { 5 // required properties from parseobject protocol 6 var objectid string? 7 var createdat date? 8 var updatedat date? 9 var acl parseacl? 10 11 /// title for the todo item 12 var title string? 13 14 /// description for the todo item 15 var description string? 16 } questo oggetto definisce una classe nel tuo database back4app qualsiasi nuova istanza di questo oggetto viene quindi memorizzata nel tuo database sotto la todolistitem todolistitem classe 3 configura todolistcontroller in todolistcontroller todolistcontroller dovremmo implementare tutta la configurazione necessaria per il navigationbar navigationbar , e tableview tableview proprietà 1 class todolistcontroller uitableviewcontroller { 2 var items \[todolistitem] = \[] 3 4 override func viewdidload() { 5 super viewdidload() 6 7 setuptableview() 8 setupnavigationbar() 9 } 10 11 private func setupnavigationbar() { 12 navigationitem title = "to do list" uppercased() 13 navigationitem rightbarbuttonitem = uibarbuttonitem(barbuttonsystemitem add, target self, action #selector(handlenewitem)) 14 } 15 16 private func setuptableview() { 17 tableview\ register(todolistitemcell self, forcellreuseidentifier todolistitemcell identifier) 18 } 19 20 override func tableview( tableview uitableview, numberofrowsinsection section int) > int { 21 items count 22 } 23 24 override func tableview( tableview uitableview, cellforrowat indexpath indexpath) > uitableviewcell { 25 let cell = tableview\ dequeuereusablecell(withidentifier todolistitemcell identifier, for indexpath) as! todolistitemcell 26 cell item = items\[indexpath row] 27 return cell 28 } 29 30 /// this method is called when the user wants to add a new item to the to do list 31 @objc private func handlenewitem() { 32 33 } 34 35 36 } per concludere questo passaggio, implementiamo la cella della vista tabella personalizzata todolistitemcell todolistitemcell 1 // content of todolistitemcell swift file 2 class todolistitemcell uitableviewcell { 3 class var identifier string { "\\(nsstringfromclass(self self)) identifier" } // cell's identifier 4 5 /// when set, it updates the title and detail texts of the cell 6 var item todolistitem? { 7 didset { 8 textlabel? text = item? title 9 detailtextlabel? text = item? description 10 } 11 } 12 13 override init(style uitableviewcell cellstyle, reuseidentifier string?) { 14 super init(style subtitle, reuseidentifier reuseidentifier) 15 16 accessorytype = detailbutton // this accessory button will be used to present edit options for the item 17 } 18 19 required init?(coder nscoder) { 20 super init(coder coder) 21 22 accessorytype = detailbutton // this accessory button will be used to present edit options for the item 23 } 24 } 4 flusso crud implementiamo tutta la logica crud nella todolistcontroller todolistcontroller classe vai a todolistcontroller swift todolistcontroller swift e aggiungi i seguenti metodi alla todolistcontroller todolistcontroller classe 1 // mark crud flow 2 extension todolistcontroller { 3 /// creates a todolistitem and stores it on your back4app database 4 /// parameters 5 /// title the title for the to do task 6 /// description an optional description for the to to task 7 func createobject(title string, description string?) { 8 9 } 10 11 /// retrieves all the todolistitem objects from your back4app database 12 func readobjects() { 13 14 } 15 16 /// updates a todolistitem object on your back4app database 17 /// parameters 18 /// objectid the object id of the todolistitem to update 19 /// newtitle new title for the to to task 20 /// newdescription new description for the to do task 21 func updateobject(objectid string, newtitle string, newdescription string?) { 22 23 } 24 25 /// deletes a todolistitem on your back4app database 26 /// parameter item the item to be deleted on your back4app database 27 func deleteobject(item todolistitem) { 28 29 } 30 } \ crea oggetto ora iniziamo a implementare il createobject(title\ description ) createobject(title\ description ) metodo crea un'istanza di todolistitem todolistitem utilizzando il init(title\ description ) init(title\ description ) inizializzatore per salvare questo nuovo elemento nel tuo database back4app, il parseswift parseswift protocollo fornisce un save() save() metodo questo metodo può essere chiamato in modo sincrono o asincrono, scegli uno di essi in base al tuo caso d'uso un'implementazione asincrona dovrebbe apparire così 1 func createobject(title string, description string?) { 2 let item = todolistitem(title title, description description) 3 4 item save { \[weak self] result in 5 guard let self = self else { return } 6 switch result { 7 case success(let saveditem) 8 self items append(saveditem) 9 dispatchqueue main async { 10 self tableview\ insertrows(at \[indexpath(row self items count 1, section 0)], with right) 11 } 12 case failure(let error) 13 dispatchqueue main async { 14 self showalert(title "error", message "failed to save item \\(error message)") 15 } 16 } 17 } 18 } ora possiamo completare l'azione per il pulsante di aggiunta situato sul lato destro della barra di navigazione vai a todolistcontroller todolistcontroller e aggiungi il seguente 1 class todolistcontroller uitableviewcontroller { 2 enum itemdescription int { case title = 0, description = 1 } 3 4 5 6 /// this method is called when the user wants to add a new item to the to do list 7 @objc private func handlenewitem() { 8 showeditcontroller(item nil) 9 } 10 11 /// presents an alert where the user enters a to do task for either create a new one (item parameter is nil) or edit an existing one 12 private func showeditcontroller(item todolistitem?) { 13 let controllertitle string = item == nil ? "new item" "update item" 14 15 let edititemalertcontroller = uialertcontroller(title controllertitle, message nil, preferredstyle alert) 16 17 edititemalertcontroller addtextfield { textfield in 18 textfield tag = itemdescription title rawvalue 19 textfield placeholder = "title" 20 textfield text = item? title 21 } 22 23 edititemalertcontroller addtextfield { textfield in 24 textfield tag = itemdescription description rawvalue 25 textfield placeholder = "description" 26 textfield text = item? description 27 } 28 29 let mainactiontitle string = item == nil ? "add" "update" 30 31 let mainaction uialertaction = uialertaction(title mainactiontitle, style default) { \[weak self] in 32 guard let title = edititemalertcontroller textfields? first(where { $0 tag == itemdescription title rawvalue })? text else { 33 return edititemalertcontroller dismiss(animated true, completion nil) 34 } 35 36 let description = edititemalertcontroller textfields? first(where { $0 tag == itemdescription description rawvalue })? text 37 38 edititemalertcontroller dismiss(animated true) { 39 if let objectid = item? objectid { // if the item passed as parameter is not nil, the alert will update it 40 self? updateobject(objectid objectid, newtitle title, newdescription description) 41 } else { 42 self? createobject(title title, description description) 43 } 44 } 45 } 46 47 let cancelaction = uialertaction(title "cancel", style cancel, handler nil) 48 49 edititemalertcontroller addaction(mainaction) 50 edititemalertcontroller addaction(cancelaction) 51 52 present(edititemalertcontroller, animated true, completion nil) 53 } 54 } \ leggi oggetto passiamo al readobjects() readobjects() metodo recuperare todolistitem todolistitem elementi dal tuo database back4app viene eseguito tramite un query\<todolistitem> query\<todolistitem> oggetto questa query è istanziata nel seguente modo 1 func readobjects() { 2 let query = todolistitem query() 3 4 } in questo tutorial utilizziamo una query che recupererà tutti gli elementi di tipo todolistitem todolistitem dal tuo database back4app nel caso tu voglia recuperare un insieme di elementi specifici, puoi fornire queryconstraint queryconstraint elementi a todolistitem query(queryconstraint ) todolistitem query(queryconstraint ) ad esempio, per recuperare tutti gli elementi in cui title == "some title" title == "some title" , la query assume la forma 1 let query = todolistitem query("title" == "some title") una volta che hai pronta la query, procediamo a recuperare gli elementi chiamando query find() query find() ancora una volta, questo può essere fatto in modo sincrono o asincrono nella nostra app to do list lo implementiamo in modo asincrono 1 func readobjects() { 2 let query = todolistitem query() 3 4 query find { \[weak self] result in 5 guard let self = self else { return } 6 switch result { 7 case success(let items) 8 self items = items 9 dispatchqueue main async { 10 self tableview\ reloadsections(\[0], with top) 11 } 12 case failure(let error) 13 dispatchqueue main async { 14 self showalert(title "error", message "failed to save item \\(error message)") 15 } 16 } 17 } 18 } con readobjects() readobjects() completato, ora possiamo recuperare tutti i compiti memorizzati nel tuo database back4app e mostrarli subito dopo che l'app entra in primo piano torna a todolistcontroller todolistcontroller e sovrascrivi il viewdidappear() viewdidappear() metodo 1 class todolistcontroller uitableviewcontroller { 2 3 4 override func viewdidappear( animated bool) { 5 super viewdidappear(animated) 6 7 readobjects() 8 } 9 10 11 } \ aggiorna oggetto dato il objectid objectid di un todolistitem todolistitem , è semplice eseguire un aggiornamento dobbiamo semplicemente istanziare un todolistitem todolistitem utilizzando il init(objectid ) init(objectid ) inizializzatore successivamente, aggiorniamo le proprietà di cui abbiamo bisogno e chiamiamo il save() save() metodo (di todolistitem todolistitem ) per salvare le modifiche 1 func updateobject(objectid string, newtitle string, newdescription string?) { 2 var item = todolistitem(objectid objectid) 3 item title = newtitle 4 item description = newdescription 5 6 item save { \[weak self] result in 7 switch result { 8 case success 9 if let row = self? items firstindex(where { $0 objectid == item objectid }) { 10 self? items\[row] = item 11 dispatchqueue main async { 12 self? tableview\ reloadrows(at \[indexpath(row row, section 0)], with fade) 13 } 14 } 15 case failure(let error) 16 dispatchqueue main async { 17 self? showalert(title "error", message "failed to save item \\(error message)") 18 } 19 } 20 } 21 } \ elimina oggetto eliminare oggetti nel tuo database back4app è molto simile a creare oggetti iniziamo creando un'istanza di todolistitem todolistitem con l'objectid dell'elemento che vogliamo eliminare successivamente, chiamiamo semplicemente (synchronous o asynchronously) il delete() delete() metodo dell'oggetto se l'eliminazione ha avuto successo, aggiorniamo l'interfaccia utente, altrimenti riportiamo l'errore 1 func deleteobject(item todolistitem) { 2 item delete { \[weak self] result in 3 switch result { 4 case success 5 if let row = self? items firstindex(where { $0 objectid == item objectid }) { 6 self? items remove(at row) 7 dispatchqueue main async { 8 self? tableview\ deleterows(at \[indexpath(row row, section 0)], with left) 9 } 10 } 11 case failure(let error) 12 dispatchqueue main async { 13 self? showalert(title "error", message "failed to save item \\(error message)") 14 } 15 } 16 } 17 } con deleteobject(item ) deleteobject(item ) e updateobject(objectid\ newtitle\ newdescription) updateobject(objectid\ newtitle\ newdescription) completati, procediamo ad aggiungere le azioni corrispondenti per chiamare queste operazioni torna a todolistcontroller todolistcontroller e aggiungi 1 // mark uitableviewdatasource delegate 2 extension todolistcontroller { 3 // when the user taps on the accessory button of a cell, we present the edit options for the to do list task 4 override func tableview( tableview uitableview, accessorybuttontappedforrowwith indexpath indexpath) { 5 guard !items isempty else { return } 6 7 showeditoptions(item items\[indexpath row]) 8 } 9 10 /// presents a sheet where the user can select an action for the to do list item 11 private func showeditoptions(item todolistitem) { 12 let alertcontroller = uialertcontroller(title title, message nil, preferredstyle actionsheet) 13 14 let editaction = uialertaction(title "edit", style default) { \[weak self] in 15 self? showeditcontroller(item item) 16 } 17 18 let deleteaction = uialertaction(title "delete", style destructive) { \[weak self] in 19 alertcontroller dismiss(animated true) { 20 self? deleteobject(item item) 21 } 22 } 23 24 let cancelaction = uialertaction(title "cancel", style cancel) { in 25 alertcontroller dismiss(animated true, completion nil) 26 } 27 28 alertcontroller addaction(editaction) 29 alertcontroller addaction(deleteaction) 30 alertcontroller addaction(cancelaction) 31 32 present(alertcontroller, animated true, completion nil) 33 } 34 } come abbiamo sottolineato in precedenza, il pulsante accessorio in ciascun todolistitemcell todolistitemcell attiva un foglio di modifica tramite il tableview( accessorybuttontappedforrowwith ) tableview( accessorybuttontappedforrowwith ) metodo delegato è fatto! a questo punto, hai imparato come eseguire le operazioni crud di base con parse su ios