Implémentation CRUD avec ParseSwift SDK pour iOS
17 min
crud parse objets dans ios introduction le stockage de données sur parse est construit autour de la \<font color="#2166ae">parse object\</font> classe chaque \<font color="#2166ae">parse object\</font> contient des paires clé valeur de données compatibles json ces données sont sans schéma, ce qui signifie que vous n'avez pas besoin de spécifier à l'avance quelles clés existent sur chaque \<font color="#2166ae">parse object\</font> vous pouvez simplement définir les paires clé valeur que vous souhaitez, et notre backend les stockera vous pouvez également spécifier les types de données selon les besoins de votre application et persister des types tels que \<font color="#2166ae">nombre\</font> , \<font color="#2166ae">booléen\</font> , \<font color="#2166ae">chaîne\</font> , \<font color="#2166ae">datetime\</font> , \<font color="#2166ae">liste\</font> , \<font color="#2166ae">geopointers\</font> , et \<font color="#2166ae">objet\</font> , les encodant en json avant de les enregistrer parse prend également en charge le stockage et la requête de données relationnelles en utilisant les types \<font color="#2166ae">pointers\</font> et \<font color="#2166ae">relations\</font> dans ce guide, vous apprendrez à effectuer des opérations de données de base à travers une application exemple crud (application de liste de tâches), qui vous montrera comment créer, lire, mettre à jour et supprimer des données de votre base de données serveur parse en utilisant le \<font color="#2166ae">parseswift sdk\</font> ce tutoriel utilise une application de base créée dans xcode 12 et ios 14 à tout moment, vous pouvez accéder au projet complet via nos dépôts github dépôt d'exemple ios https //github com/templates back4app/ios crud to do list objectif pour apprendre à effectuer des opérations de base sur une base de données back4app en utilisant une application de liste de tâches comme exemple prérequis pour compléter ce guide rapide, vous avez besoin de xcode une application créée sur back4app suivez le tutoriel sur la nouvelle application parse https //www back4app com/docs/get started/new parse app pour apprendre à créer une application parse sur back4app remarque suivez le tutoriel d'installation du sdk parse (swift) https //www back4app com/docs/ios/parse swift sdk pour créer un projet xcode connecté à back4app comprendre notre application de liste de tâches pour mieux comprendre le \<font color="#2166ae">sdk parseswift\</font> vous allez effectuer des opérations crud sur une application de liste de tâches la base de données de l'application aura une classe de tâche simple avec un titre et une description (tous deux \<font color="#2166ae">chaînes\</font> ) vous pouvez mettre à jour le titre et/ou la description de chaque tâche référence rapide des commandes que nous allons utiliser une fois qu'un objet conforme au \<font color="#2166ae">parseswift\</font> protocole, il implémente automatiquement un ensemble de méthodes qui vous permettront de gérer l'objet et de mettre à jour les modifications sur votre base de données back4app étant donné l'objet \<font color="#2166ae">todolistitem\</font> 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 } ces méthodes sont listées ci dessous 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 créer un modèle d'application de liste de tâches à tout moment, vous pouvez accéder au projet complet via nos dépôts github dépôt d'exemple ios https //github com/templates back4app/ios crud to do list allez dans xcode et trouvez le \<font color="#2166ae">scenedelegate swift\</font> fichier afin d'ajouter une barre de navigation en haut de l'application, nous configurons un \<font color="#2166ae">uinavigationcontroller\</font> comme contrôleur de vue racine de la manière suivante 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 du contrôleur de vue racine ( \<font color="#2166ae">todolistcontroller\</font> ) pour le contrôleur de navigation est une sous classe de \<font color="#2166ae">uitableviewcontroller\</font> , cela facilite la mise en page d'une liste d'éléments 2 configurer l'objet crud les objets que vous souhaitez enregistrer dans votre base de données back4app doivent respecter le \<font color="#2166ae">parseobject\</font> protocole dans notre application to do list, cet objet est \<font color="#2166ae">todolistitem\</font> par conséquent, vous devez d'abord créer cet objet 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 } cet objet définit une classe dans votre base de données back4app toute nouvelle instance de cet objet est ensuite stockée dans votre base de données sous la \<font color="#2166ae">todolistitem\</font> classe 3 configurer todolistcontroller dans \<font color="#2166ae">todolistcontroller\</font> nous devrions implémenter toute la configuration nécessaire pour le \<font color="#2166ae">navigationbar\</font> , et \<font color="#2166ae">tableview\</font> propriétés 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 } pour conclure cette étape, nous implémentons la cellule de vue de table personnalisée \<font color="#2166ae">todolistitemcell\</font> 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 flux crud nous implémentons toute la logique crud dans la \<font color="#2166ae">todolistcontroller\</font> classe allez à \<font color="#2166ae">todolistcontroller swift\</font> et ajoutez les méthodes suivantes à la \<font color="#2166ae">todolistcontroller\</font> 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 } \ créer un objet maintenant, nous commençons à implémenter le \<font color="#2166ae">createobject(title\ description )\</font> méthode créez une instance de \<font color="#2166ae">todolistitem\</font> en utilisant le \<font color="#2166ae">init(title\ description )\</font> initialiseur afin de sauvegarder ce nouvel élément dans votre base de données back4app, le \<font color="#2166ae">parseswift\</font> protocole fournit une \<font color="#2166ae">save()\</font> méthode cette méthode peut être appelée de manière synchrone ou asynchrone, choisissez l'une d'elles selon votre cas d'utilisation une implémentation asynchrone devrait ressembler à ceci 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 } maintenant, nous pouvons compléter l'action pour le bouton d'ajout situé à droite de la barre de navigation allez à \<font color="#2166ae">todolistcontroller\</font> et ajoutez ce qui suit 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 } \ lire l'objet nous passons à la \<font color="#2166ae">readobjects()\</font> méthode récupérer les \<font color="#2166ae">todolistitem\</font> éléments de votre base de données back4app se fait via un \<font color="#2166ae">query\<todolistitem\>\</font> objet cette requête est instanciée de la manière suivante 1 func readobjects() { 2 let query = todolistitem query() 3 4 } dans ce tutoriel, nous utilisons une requête qui récupérera tous les éléments de type \<font color="#2166ae">todolistitem\</font> de votre base de données back4app si vous souhaitez récupérer un ensemble d'éléments spécifiques, vous pouvez fournir des \<font color="#2166ae">queryconstraint\</font> éléments à \<font color="#2166ae">todolistitem query(queryconstraint )\</font> par exemple, pour récupérer tous les éléments où \<font color="#2166ae">title == "some title"\</font> , la requête prend la forme 1 let query = todolistitem query("title" == "some title") une fois que vous avez la requête prête, nous procédons à la récupération des éléments en appelant \<font color="#2166ae">query find()\</font> encore une fois, cela peut être fait de manière synchrone ou asynchrone dans notre application to do list, nous l'implémentons de manière asynchrone 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 } avec \<font color="#2166ae">readobjects()\</font> terminé, nous pouvons maintenant récupérer toutes les tâches stockées dans votre base de données back4app et les afficher juste après que l'application entre au premier plan retournez à \<font color="#2166ae">todolistcontroller\</font> et remplacez la méthode \<font color="#2166ae">viewdidappear()\</font> 1 class todolistcontroller uitableviewcontroller { 2 3 4 override func viewdidappear( animated bool) { 5 super viewdidappear(animated) 6 7 readobjects() 8 } 9 10 11 } \ mettre à jour l'objet étant donné le \<font color="#2166ae">objectid\</font> d'un \<font color="#2166ae">todolistitem\</font> objet, il est simple de réaliser une mise à jour nous instancions simplement un \<font color="#2166ae">todolistitem\</font> en utilisant le \<font color="#2166ae">init(objectid )\</font> initialiseur ensuite, nous mettons à jour les propriétés dont nous avons besoin et appelons la \<font color="#2166ae">save()\</font> méthode (de \<font color="#2166ae">todolistitem\</font> ) pour enregistrer les modifications 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 } \ supprimer l'objet la suppression d'objets dans votre base de données back4app est très similaire à la création d'objets nous commençons par créer une instance de \<font color="#2166ae">todolistitem\</font> avec l'objectid de l'élément que nous voulons supprimer ensuite, nous appelons simplement (synchroniquement ou asynchroniquement) la \<font color="#2166ae">delete()\</font> méthode de l'objet si la suppression a réussi, nous mettons à jour l'interface utilisateur, sinon nous signalons l'erreur 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 } avec \<font color="#2166ae">deleteobject(item )\</font> et \<font color="#2166ae">updateobject(objectid\ newtitle\ newdescription)\</font> terminé, nous procédons à ajouter les actions correspondantes pour appeler ces opérations retournez à \<font color="#2166ae">todolistcontroller\</font> et ajoutez 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 } comme nous l'avons souligné précédemment, le bouton accessoire dans chaque \<font color="#2166ae">todolistitemcell\</font> déclenche une feuille d'édition via le \<font color="#2166ae">tableview( accessorybuttontappedforrowwith )\</font> méthode déléguée c'est fait! à ce stade, vous avez appris à effectuer les opérations crud de base avec parse sur ios