iOS
...
Data Objects
Operações CRUD iOS com Parse SDK: Guia Técnico Completo
17 min
crud parse objetos no ios introdução armazenar dados no parse é construído em torno da parse object parse object classe cada parse object parse object contém pares de chave valor de dados compatíveis com json esses dados são sem esquema, o que significa que você não precisa especificar antecipadamente quais chaves existem em cada parse object parse object você pode simplesmente definir quaisquer pares de chave valor que desejar, e nosso backend irá armazená los você também pode especificar os tipos de dados de acordo com as necessidades do seu aplicativo e persistir tipos como número número , booleano booleano , string string , datetime datetime , lista lista , geopointers geopointers , e objeto objeto , codificando os em json antes de salvar o parse também suporta armazenar e consultar dados relacionais usando os tipos pointers pointers e relações relações neste guia, você aprenderá como realizar operações básicas de dados através de um exemplo de aplicativo crud (aplicativo de lista de tarefas), que mostrará como criar, ler, atualizar e excluir dados do seu banco de dados do servidor parse usando o parseswift sdk parseswift sdk este tutorial usa um aplicativo básico criado no xcode 12 e ios 14 a qualquer momento, você pode acessar o projeto completo através de nossos repositórios no github repositório de exemplo ios objetivo para aprender como realizar operações básicas de banco de dados no back4app usando um aplicativo de lista de tarefas como exemplo pré requisitos para completar este guia rápido, você precisa xcode um aplicativo criado no back4app siga o tutorial de novo aplicativo parse para aprender como criar um aplicativo parse no back4app nota siga o tutorial de instalação do parse sdk (swift) para criar um projeto xcode conectado ao back4app entendendo nosso aplicativo de lista de tarefas para entender melhor o parseswift sdk parseswift sdk você realizará operações crud em um aplicativo de lista de tarefas o banco de dados da aplicação terá uma classe de tarefa simples com um título e uma descrição (ambos strings strings ) você pode atualizar o título e/ou a descrição de cada tarefa referência rápida dos comandos que vamos usar uma vez que um objeto conforma o parseswift parseswift protocolo, ele implementa automaticamente um conjunto de métodos que permitirá gerenciar o objeto e atualizar quaisquer alterações no seu banco de dados back4app dado o objeto 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 } esses métodos estão listados abaixo 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 criar modelo de aplicativo de lista de tarefas a qualquer momento, você pode acessar o projeto completo através de nossos repositórios no github repositório de exemplo para ios vá para o xcode e encontre o scenedelegate swift scenedelegate swift arquivo para adicionar uma barra de navegação no topo do aplicativo, configuramos um uinavigationcontroller uinavigationcontroller como o controlador de visualização raiz da seguinte maneira 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 } a classe do controlador de visualização raiz ( todolistcontroller todolistcontroller ) para o controlador de navegação é uma subclasse de uitableviewcontroller uitableviewcontroller , isso facilita a disposição de uma lista de itens 2 configurar o objeto crud os objetos que você deseja salvar no seu banco de dados back4app devem conformar ao parseobject parseobject protocolo no nosso aplicativo to do list, este objeto é todolistitem todolistitem portanto, você primeiro precisa criar este objeto 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 } este objeto define uma classe no seu banco de dados back4app qualquer nova instância deste objeto é então armazenada no seu banco de dados sob a todolistitem todolistitem classe 3 configurar todolistcontroller no todolistcontroller todolistcontroller devemos implementar toda a configuração necessária para a navigationbar navigationbar , e tableview tableview propriedades 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 } para concluir esta etapa, implementamos a célula de visualização de tabela personalizada 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 fluxo crud implementamos toda a lógica crud na todolistcontroller todolistcontroller classe vá para todolistcontroller swift todolistcontroller swift e adicione os seguintes métodos à 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 } \ criar objeto agora começamos a implementar o createobject(title\ description ) createobject(title\ description ) método crie uma instância de todolistitem todolistitem usando o init(title\ description ) init(title\ description ) inicializador para salvar este novo item no seu banco de dados back4app, o parseswift parseswift protocolo fornece um save() save() método este método pode ser chamado de forma síncrona ou assíncrona, escolha um deles de acordo com seu caso de uso uma implementação assíncrona deve se parecer com isso 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 } agora podemos completar a ação para o botão de adicionar localizado no lado direito da barra de navegação vá para todolistcontroller todolistcontroller e adicione o seguinte 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 } \ ler objeto nós nos movemos para o readobjects() readobjects() método recuperar todolistitem todolistitem itens do seu banco de dados back4app é realizado através de um query\<todolistitem> query\<todolistitem> objeto esta consulta é instanciada da seguinte maneira 1 func readobjects() { 2 let query = todolistitem query() 3 4 } neste tutorial, usamos uma consulta que irá recuperar todos os itens do tipo todolistitem todolistitem do seu banco de dados back4app caso você queira recuperar um conjunto de itens específicos, pode fornecer queryconstraint queryconstraint elementos para todolistitem query(queryconstraint ) todolistitem query(queryconstraint ) por exemplo, para buscar todos os itens onde title == "some title" title == "some title" , a consulta assume a forma 1 let query = todolistitem query("title" == "some title") uma vez que você tenha a consulta pronta, prosseguimos para recuperar os itens chamando query find() query find() novamente, isso pode ser feito de forma síncrona ou assíncrona no nosso aplicativo de lista de tarefas, implementamos de forma assíncrona 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 } com readobjects() readobjects() concluído, agora podemos buscar todas as tarefas armazenadas no seu banco de dados back4app e mostrá las logo após o aplicativo entrar em primeiro plano volte para todolistcontroller todolistcontroller e sobrescreva o viewdidappear() viewdidappear() método 1 class todolistcontroller uitableviewcontroller { 2 3 4 override func viewdidappear( animated bool) { 5 super viewdidappear(animated) 6 7 readobjects() 8 } 9 10 11 } \ atualizar objeto dado o objectid objectid de um todolistitem todolistitem , é simples realizar uma atualização nós simplesmente instanciamos um todolistitem todolistitem usando o init(objectid ) init(objectid ) inicializador em seguida, atualizamos as propriedades que precisamos e chamamos o save() save() método (de todolistitem todolistitem ) para salvar as alterações 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 } \ deletar objeto excluir objetos no seu banco de dados back4app é muito semelhante a criar objetos começamos criando uma instância de todolistitem todolistitem com o objectid do item que queremos excluir em seguida, simplesmente chamamos (sincronamente ou assincronamente) o delete() delete() método do objeto se a exclusão for bem sucedida, atualizamos a interface do usuário, caso contrário, relatamos o erro 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 } com deleteobject(item ) deleteobject(item ) e updateobject(objectid\ newtitle\ newdescription) updateobject(objectid\ newtitle\ newdescription) , concluído, prosseguimos para adicionar as ações correspondentes para chamar essas operações volte para todolistcontroller todolistcontroller e adicione 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 } como mencionamos anteriormente, o botão acessório em cada todolistitemcell todolistitemcell aciona uma folha de edição via o tableview( accessorybuttontappedforrowwith ) tableview( accessorybuttontappedforrowwith ) método delegado está feito! neste ponto, você aprendeu como realizar as operações básicas de crud com parse no ios