iOS
...
Data Objects
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 parse object parse object classe chaque parse object parse object 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 parse object parse object 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 nombre nombre , booléen booléen , chaîne chaîne , datetime datetime , liste liste , geopointers geopointers , et objet objet , 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 pointers pointers et relations relations 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 parseswift sdk parseswift sdk 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 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 pour apprendre à créer une application parse sur back4app remarque suivez le tutoriel d'installation du sdk parse (swift) pour créer un projet xcode connecté à back4app comprendre notre application de liste de tâches pour mieux comprendre le sdk parseswift sdk parseswift 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 chaînes chaînes ) 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 parseswift parseswift 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 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 } 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 allez dans xcode et trouvez le scenedelegate swift scenedelegate swift fichier afin d'ajouter une barre de navigation en haut de l'application, nous configurons un uinavigationcontroller uinavigationcontroller 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 ( todolistcontroller todolistcontroller ) pour le contrôleur de navigation est une sous classe de uitableviewcontroller uitableviewcontroller , 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 parseobject parseobject protocole dans notre application to do list, cet objet est todolistitem todolistitem 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 todolistitem todolistitem classe 3 configurer todolistcontroller dans todolistcontroller todolistcontroller nous devrions implémenter toute la configuration nécessaire pour le navigationbar navigationbar , et tableview tableview 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 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 flux crud nous implémentons toute la logique crud dans la todolistcontroller todolistcontroller classe allez à todolistcontroller swift todolistcontroller swift et ajoutez les méthodes suivantes à la 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 } \ créer un objet maintenant, nous commençons à implémenter le createobject(title\ description ) createobject(title\ description ) méthode créez une instance de todolistitem todolistitem en utilisant le init(title\ description ) init(title\ description ) initialiseur afin de sauvegarder ce nouvel élément dans votre base de données back4app, le parseswift parseswift protocole fournit une save() save() 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 à todolistcontroller todolistcontroller 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 readobjects() readobjects() méthode récupérer les todolistitem todolistitem éléments de votre base de données back4app se fait via un query\<todolistitem> query\<todolistitem> 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 todolistitem todolistitem de votre base de données back4app si vous souhaitez récupérer un ensemble d'éléments spécifiques, vous pouvez fournir des queryconstraint queryconstraint éléments à todolistitem query(queryconstraint ) todolistitem query(queryconstraint ) par exemple, pour récupérer tous les éléments où title == "some title" title == "some title" , 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 query find() query find() 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 readobjects() readobjects() 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 à todolistcontroller todolistcontroller et remplacez la méthode viewdidappear() viewdidappear() 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 objectid objectid d'un todolistitem todolistitem objet, il est simple de réaliser une mise à jour nous instancions simplement un todolistitem todolistitem en utilisant le init(objectid ) init(objectid ) initialiseur ensuite, nous mettons à jour les propriétés dont nous avons besoin et appelons la save() save() méthode (de todolistitem todolistitem ) 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 todolistitem todolistitem avec l'objectid de l'élément que nous voulons supprimer ensuite, nous appelons simplement (synchroniquement ou asynchroniquement) la delete() delete() 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 deleteobject(item ) deleteobject(item ) et updateobject(objectid\ newtitle\ newdescription) updateobject(objectid\ newtitle\ newdescription) terminé, nous procédons à ajouter les actions correspondantes pour appeler ces opérations retournez à todolistcontroller todolistcontroller 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 todolistitemcell todolistitemcell déclenche une feuille d'édition via le tableview( accessorybuttontappedforrowwith ) tableview( accessorybuttontappedforrowwith ) 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