Banco de Dados em aplicativos Mobile Swift
Nesta etapa, você deverá resolver o desafio 02:
Para isso, você estudará os seguintes conteúdos:
Nas primeiras versões da linguagem Swift, o código era fechado e somente a Apple detinha seu controle de desenvolvimento. Não havia, portanto, a possibilidade de utilizar a linguagem Swift para conectar a um Banco de Dados como o MySQL.
Após a versão 2.2, em dezembro de 2015, a linguagem tornou-se open source e a IBM iniciou o projeto para tornar a linguagem capaz de ser aplicada em soluções para servidores. Surgiram também outros projetos para dar a capacidade de acesso aos Bancos de Dados, como o da Linux e o projeto SwiftKueryMySQL, que vamos utilizar para nossas atividades.
Fonte: Pexels
Mas antes de iniciar necessitaremos preparar o ambiente de desenvolvimento para que as rotinas possam ser compiladas e executadas adequadamente. Esta preparação inclui os seguintes passos:
Fonte: Freepik
Para o desenvolvimento de uma aplicação para iOS é necessário ter o Apple ID e o registro de desenvolvedor Apple. O Apple ID é uma conta gratuita, usada para conectar seu perfil com informações e configurações em dispositivos Apple. Para carregar aplicativos na loja Apple é necessário ter o registro de desenvolvedor Apple, com custo de US$ 99,00 anualmente. Para o nosso projeto, utilizaremos uma conta de desenvolvimento sem custo para poder instalar o aplicativo no dispositivo móvel conectado via USB.
Clique aqui para ver o passo-a-passo para criar sua Apple ID com o registro de desenvolvedor Apple.
O Xcode é um software livre da Apple, usada como IDE para gerenciamento de projetos para o sistema operacional macOS.
Com a evolução da linguagem Swift e do sistema operacional da Apple, é importante que utilizemos as versões mais recentes da linguagem. Estabelecer a versão 5.3 como mínima para a linguagem Swift implica diretamente na definição das versões do macOS (Sistema Operacional no qual o Xcode será utilizado), iOS (Sistema Operacional do dispositivo móvel) e Xcode (IDE). A tabela abaixo elaborada pela Apple apresenta a relação das versões entre os ambientes e a linguagem Swift. Confira na tabela elaborada pela Apple a seguir abas para conhecer a relação das versões entre os ambientes e a linguagem Swift.
Clique aqui para ver a tabela.
A partir destas versões apresentadas podemos determinar qual é a plataforma de desenvolvimento poderemos utilizar. A tabela abaixo apresenta as menores versões de equipamentos Apple que podemos utilizar para o desenvolvimento:
Equipamento | Versão |
---|---|
iMac 21.5” e 27” | Late 2012 |
Mac Mini | Late 2012 |
MaBook Retina 12” | Early 2015 |
MacBook Air 11” e 13” | Mid 2012 |
MacBook Pro 13” e 15” | Mid 2012 |
MacBook Pro Retina 13” e 15” | Late 2012 |
Fonte: https://eshop.macsales.com/guides/Mac_OS_X_Compatibility
Os dispositivos móveis mais antigos que são suportados ao desenvolvimento, segundo as informações da primeira tabela são: iPhone 6s e iPad Air 2.
Veja como instalar o Xcode e ferramentas de linha de comando do Xcode, clicando aqui.
Necessitaremos instalar o servidor de banco de dados MySQL para que nossos programas consigam armazenar seus dados. Caso já tenha instalado pode pular este passo.
Confira como instalar o Servidor de Banco de dados MySQL e MySQL Workbench clicando aqui.
Nesta etapa vamos preparar a infraestrutura para que possamos compilar nossos programas utilizando as bibliotecas que tem os mecanismos de acesso ao banco de dados MySQL. Sem esta instalação nossos programas não serão capazes de acessar o servidor de banco de dados, mesmo já tendo instalado o Servidor MySQL.
Clique aqui para conferir como instalar o kit de desenvolvimento do MySQL.
Agora que já temos toda a infraestrutura preparada, podemos criar o nosso projeto inicial.
Acompanhe o tutorial de criação do projeto inicial no Xcode clicando aqui.
Qualquer programa que necessite conectar a um Banco de Dados necessita conhecer os parâmetros de conexão. Este tipo de informação é consistente em toda a variedade de Servidores de Banco de Dados. Vamos conhecer quais parâmetros são estes.
Os parâmetros para conexão ao banco de dados são cinco. Clique nas abas para conhecê-los.
Fonte: Freepik
o endereço de rede onde o servidor de banco de dados permite conexões
a porta de comunicação de rede, para o MySQL o padrão é 3306
o nome da conta que tem privilégio de conexão e execução de comandos nas bases de dados
a senha para a conta de conexão do banco de dados
o esquema de banco de dados que foi previamente criada no servidor de banco de dados
Para fazer a conexão com o banco de dados, devemos nos certificar de que o esquema do banco de dados já exista, isto é, o banco de dados precisa primeiro ser criado para depois ser conectado. O esquema de Banco de Dados foi estudada pode ser criado com a instrução a seguir.
CREATE SCHEMA nome_do_esquema;
Abra o MySQL Workbench conecte ao Banco de Dados e execute esta instrução definindo o nome_do_esquema que defina o que será armazenado.
Vamos construir uma interface de programação (API) que oferecerá os mecanismos necessários aos programas para o acesso e execução de instruções no Banco de Dados. Iniciamos com os parâmetros de conexão, eles serão armazenados em um arquivo com o formato JSON, por exemplo:
{
"host": "127.0.0.1",
"port": "3306",
"username": "root"
,
"password": "senai132",
"database": "musicas"
}
Este arquivo com os parâmetros de conexão será chamado
connection.json
e ficará junto dos programas no projeto Xcode.
Nosso primeiro passo é criar a API de conexão. Clique no player a seguir e confira.
Clique aqui para baixar a versão PDF do vídeo.
Nossa API será incrementada com novos métodos conforme a necessidade de mais funcionalidade e, ao final deste projeto, esta API poderá ser utilizada com qualquer estrutura de dados que necessite gravar suas informações em um banco de dados MySQL.
A seguir serão abordados alguns comando de ação no banco de dados. Siga em frente e assista aos vídeos ou leia a versão textual do vídeo se preferir.
Nosso primeiro vídeo é sobre criar estruturas no banco de dados. Clique no player e confira.
Clique aqui para baixar a versão PDF do vídeo.
Agora vamos inserir dados na tabela.Clique no player e confira.
Clique aqui para baixar a versão PDF do vídeo.
No próximo vídeo, acompanharemos o tutorial de como efetuar consultas, então clique no player e confira.
Clique aqui para baixar a versão PDF do vídeo.
Clique no player e assista ao vídeo para saber como fazer atualizações.
Clique aqui para baixar a versão PDF do vídeo.
A exclusão de registros das tabelas segue o mesmo raciocínio ao aplicado na atualização de dados. Para esta atividade vamos excluir um registro na tabela álbuns que não contêm músicas cadastradas.
A instrução SQL a seguir mostra como excluir um registro do nosso exemplo.
DELETE FROM Album WHERE nome = 'Stay Like This';
Vamos criar outro arquivo do tipo Swift agora com o nome RemoverRegistro e implemente o código a seguir:
import Foundation
import SwiftKuery
func removeAlbum() {
let utils = CommonUtils.sharedInstance
let albuns = Albuns()
consulta1()
print("\n- - - - - - - - - - - - - - - - - - - - - - - - \n")
utils.executaQuery(Delete(from: albuns).where(albuns.nome == "Stay Like This"))
consulta1()
}
Para a apagar o registro do álbum, basta passar a instância da classe
Albuns
na estrutura Delete
e informar o critério para a
seleção do registro a ser removido.
A função consulta1
permite observarmos a existência do
registro antes da execução e a constatação da efetividade da operação após a execução.
Para executarmos esta função deveremos acrescentar sua chamada no programa main da seguinte forma:
import Foundation
//criaTabelas()
//insereDados()
//consulta1()
//consulta2()
//atualizaEstilo()
removeAlbum()
Observe pelo que foi apresentado que o registro com o texto Stay Like This foi removido com sucesso.
Depois de conhecer como remover um registro, agora vamos remover as tabelas. Para nossa atividade, vamos remover todas as tabelas e este procedimento necessita seguir uma sequencia correta para respeitar as regras de associação entre as tabelas.
As instruções SQL para executar esta atividade são:
DROP TABLE Musicas_do_Album;
DROP TABLE Musica;
DROP TABLE Album;
DROP TABLE Estilo;
DROP TABLE Banda;
Vamos preparar nossa classe CommonUtils
para processar a execução
da remoção das tabelas implementando a seguinte função:
func removeTabela(_ tabela: Table) {
executaQuery(tabela.drop())
}
A função removeTabela
recebe uma instância de
Table
para repassar o resultado da chamada ao método drop
como
parâmetro de executaQuery
, que executará a requisição ao banco de dados.
Agora com nossa API finalizada falta somente implementar a função para processar a remoção de todas as tabelas, crie arquivo Swift com o nome RemoveTabelas e adicione o seguinte código:
import Foundation
import SwiftKuery
func removeTabelas() {
let utils = CommonUtils.sharedInstance
for tabela in [
MusicasDosAlbuns(),
Musicas(),
Albuns(),
Estilos(),
Bandas()
]{
print("Apagando \(tabela.nameInQuery)")
utils.removeTabela(tabela)
}
print("Todas as tabelas foram removidas")
}
Esta função cria a lista das tabelas na ordem correta para a deleção e
executa a exclusão, uma a uma, apresentado o seu nome a cada passagem, o nome é extraído
da instância da tabela utilizando uma propriedade com o nome nameInQuery
.
O programa main receberá um novo ajuste, vamos incluir a chamada a função removeTabelas:
import Foundation
//criaTabelas()
//insereDados()
//consulta1()
//consulta2()
//atualizaEstilo()
//removeAlbum()
removeTabelas()
Após a execução desta função não existem mais tabelas no Bando de Dados. Nosso último ajuste no programa main será tirar todos os comentários para deixar que o programa possa executar todas as operações.
O programa codificado serve como modelo de execução, cada função como um exemplo de como utilizar cada ação no banco de dados e, por fim, uma API pronta para utilização com qualquer outra estrutura de dados que deseje utilizar.
A fim de prover informações de como utilizar um conjunto de rotinas a documentação é essencial, pois no ambiente de desenvolvimento é possível consultar em tempo real. Também auxilia na manutenção do código pelo motivo de a documentação de uma sub-rotina ficar próxima a implementação deste.
Agora que terminamos o desenvolvimento de nossa API vamos acrescentar alguma documentação para facilitar a compreensão de sua utilização. Então vejamos o que temos a documentar:
Fonte: Freepik
import Foundation
import SwiftKuery
import SwiftKueryMySQL
class CommonUtils {
private var pool: ConnectionPool?
private var connection: Connection?
static let sharedInstance = CommonUtils()
private init() {}
private func getConnectionPool(characterSet: String? = nil) -> ConnectionPool {...}
func getConnection() -> Connection? {...}
func criaTabela(_ tabela: Table) {...}
func executaQuery(_ query: Query) {...}
func executaConsulta(_ query: Select,_ aoFinal: @escaping ([[Any?]]?)->()) {...}
func removeTabela(_ tabela: Table) {...}
}
Ocultando a implementação dos métodos para termos a visão de toda a estrutura da classe
CommonUtils
podemos compreender onde poderemos adicionar a documentação. Adicionamos a
documentação acrescentando ///
antes do texto. Ao descrever os parâmetros acrescentando
- Parameter
antes de seu nome e descrição. Veja como fica a nossa API com a
documentação adicionada:
import Foundation
import SwiftKuery
import SwiftKueryMySQL
/// Esta classe tem as implementações para o acesso ao Banco de Dados
class CommonUtils {
private var pool: ConnectionPool?
private var connection: Connection?
static let sharedInstance = CommonUtils()
private init() {}
/// Este método é de uso interno para a criação do pool de conexões ao bando de dados
private func getConnectionPool(characterSet: String? = nil) -> ConnectionPool {...}
/// Este método obtém a conexão ao banco de dados do pool de conexões
func getConnection() -> Connection? {...}
/// Este método executa uma consulta SQL (SELECT)
/// - Parameter query: Uma instância de Select
/// - Parameter aoFinal: O Bloco de instruções que receberá o retorno do Select
func criaTabela(_ tabela: Table) {...}
/// Este método executa instruções SQL (INSERT, UPDATE, DELETE)
/// - Parameter query: Uma instância de Query (Insert, Update ou Delete)
func executaQuery(_ query: Query) {...}
/// Este método executa a instrução de criação de tabelas (CREATE TABLE)
/// - Parameter tabela: Uma instância de Table
func executaConsulta(_ query: Select,_ aoFinal: @escaping ([[Any?]]?)->()) {...}
/// Este método é utilizado para a exclusão de tabelas (DROP TABLE)
/// - Parameter tabela: Uma instância de Table
func removeTabela(_ tabela: Table) {...}
}
Como é possível constatar adicionar documentação ao código é muito simples. Veja agora como a visualizamos quando estamos codificando:
Dica
Pressionado a tecla Option e posicionando o mouse sobre o método, um diálogo é apresentado com a documentação.
Fonte: Pixabay
1. Quais são os parâmetros de conexão ao Banco de Dados?
Atenção
Selecione uma alternativa.
Parabéns! Resposta correta.
Endereço, Porta, Usuário, Senha, Esquema são os parâmetros de conexão com o Banco de dados.
Ops! Tente novamente!
Lembre-se de que é essencial determinar onde será a conexão e quem se conectará.
Resposta incorreta.
A resposta correta está representada
na alternativa D.
Endereço, Porta, Usuário, Senha, Esquema são os parâmetros de conexão com o Banco de dados. Retome o tópico Parâmetros de conexão..
2. Quais os limites das versões para o Desenvolvimento e dispositivos?
Atenção
Selecione uma alternativa.
Parabéns! Resposta correta.
XCode 12 e IOS 9 são os limites mínimos para desenvolvimento e dispositivos.
Ops! Tente novamente!
Lembre-se de linguagem, IDE e sistema operacional estão sempre em evolução e é importante definir um limite mínimo para cada um deles.
Resposta incorreta.
A resposta correta está representada
na alternativa D.
XCode 12 e IOS 9 são os limites mínimos para desenvolvimento e dispositivos. Retome o tópico Instalar o Xcode e ferramentas de linha de comando do Xcode.
3. Quais são as estruturas utilizadas para efetuar interações do Bando de Dados?
Atenção
Selecione uma alternativa.
Parabéns! Resposta correta.
Insert, Select, Update, Delete são as estruturas utilizadas para efetuar interações com o Banco de dados.
Ops! Tente novamente!
Lembre-se de que dados não são criados no banco de dados, e sim inseridos.
Resposta incorreta.
A resposta correta está representada
na alternativa C.
Insert, Select, Update, Delete são as estruturas utilizadas para efetuar interações com o Banco de dados. Retorne ao tópico Executando comandos de ação.
4. Marque verdadeiro ou falso para as afirmações a seguir:
Verdadeiro
Falso
Verdadeiro
Falso
Verdadeiro
Falso
Verdadeiro
Falso
Verdadeiro
Falso
Você estudou:
Nesta etapa, passamos a conhecer a linguagem de programação Swift e suas particularidades, tais como a declaração de texto e técnica de interpolação, declaração de variáveis e constantes, conhecemos classes, estruturas, enumerações, coleções, tuplas, aprendemos sobre closures, extensões e tipos opcionais, vimos como manipulas datas e horas, por fim vimos protocolos e exceções.
Em seguida, construímos uma API para o acesso e interação ao banco de dados, implementamos as rotinas para criar tabelas, inserir dados, consultar dados, alterar dados, excluir registros e excluir tabelas, também acrescentamos a documentação para a nossa API.
Agora vocês já têm tudo para construir o seu projeto. Continue estudando e se aprimorando.
Até breve e sucesso!
Aviso
Parece que você já iniciou o curso, você pode: