Então, vamos mergulhar no SQLite. Novamente, obtivemos um módulo
para o suportado pelo expo, que instalamos da mesma forma que instalamos os outros módulos
nativos e
agora apenas algumas palavras rápidas sobre o SQLite. O SQLite é um sistema de banco de dados que
você pode dizer que está disponível no iOS e no Android, para que você
possa configurar rapidamente esse banco de dados, será super fácil com este módulo e poderá usar alguma sintaxe SQL, alguma sintaxe básica do SQL
para executar consultas nesse banco de dados.
Agora, não vou me aprofundar na sintaxe SQL aqui, porque esse obviamente não é um curso sobre
SQL, mas para aprender tudo sobre como usá-lo,
confira os documentos oficiais e, em anexo, você também encontrará um link com um snippet mais detalhado que mergulha sobre como usar o pacote SQLite
em um aplicativo expo, onde você pode ver mais exemplos de como excluir coisas e
assim por diante, e também encontrará uma referência SQL para SQLite, onde pode aprender mais sobre
a sintaxe SQL.
Vou mostrar algumas sintaxe básica agora neste módulo,
mas para todas as coisas que você pode fazer em suas consultas, para
todos os comandos que você pode executar, verifique definitivamente esses recursos. Agora, com isso, vamos adicionar o SQLite executando
expo install expo-sqlite em nosso projeto, que instalará isso em nosso projeto aqui e funcionará imediatamente, como
antes, nenhuma configuração extra é necessária e,
uma vez concluída a instalação, podemos comece a trabalhar com SQLite.
Agora, trabalhar com o banco de dados envolve algumas coisas, por
exemplo, você precisa abrir uma conexão com o banco de dados e, se ainda não existe um banco de dados, o
que ocorre quando você o acessa pela primeira vez durante a vida útil do aplicativo, ele também cria esse banco de
dados e depois de ter essa conexão com o banco de dados criado, é claro que você pode
executar consultas nele.
Então, para isso, adicionarei uma pasta de ajudantes com um banco de dados. arquivo js lá que você não precisa fazer,
mas eu quero ter minha lógica de banco de dados para manter meus outros arquivos magros e para que eu tenha
um arquivo onde possamos ver toda a lógica do banco de dados. Agora, podemos importar o SQLite do pacote e, como você vê,
a sintaxe de importação agora é um pouco diferente da dos outros pacotes.
Em vez de importar a estrela como SQLite deste pacote, instalamos aqui com esta sintaxe de importação
nomeada, além
disso, ainda é muito semelhante e
agora podemos começar a usar esse pacote aqui.
Agora, antes de tudo, criarei uma constante db que contém uma referência ao meu banco de dados que recebo executando o
banco de dados aberto SQLite e lá passamos um nome de
banco de dados que poderia ser um local. db.
Agora, o que isso fará é que ele se conecte a esse banco de dados ou crie o banco de dados,
caso não consiga encontrá-lo; portanto, quando lançamos o aplicativo pela primeira vez, você não precisa fazer mais nada para ter acesso ao
banco de dados. muito trivial.
Agora, essa linha de código será executada sempre que executarmos esse arquivo, o que efetivamente acontece quando
importamos esse arquivo pela primeira vez em qualquer lugar.
Agora eu também quero adicionar uma função init aqui armazenada em uma constante que eu faço para inicializar
esse banco de dados e exportarei essa função como uma exportação nomeada.
Agora, nesta função, quero ter certeza de que criamos uma tabela básica, porque os bancos de dados SQL funcionam com
tabelas que mantêm seus registros e registros são basicamente as linhas de dados que você adiciona à sua tabela.
Agora, inicialmente, quando criamos o banco de dados, ele está vazio, mas para armazenar locais, precisamos de uma tabela
que possa conter esses locais.
Então, eu quero ter uma função de inicialização aqui que realmente criará essa tabela se ela ainda
não existir.
Então, lá, eu posso usar minha constante db que aponta para esse banco de dados e executar a transação. Agora, transação é um método oferecido pelo pacote SQLite no
banco de dados e você encontrará tudo isso nos documentos oficiais, é claro,
e esse
método de transação funciona como um argumento que fornece acesso ao objeto de transação
que ele cria para você.
O conceito de transações simplesmente é um conceito em que este pacote no final garante que sua consulta seja sempre executada como
um todo e que, se alguma parte da consulta falhar, a consulta inteira será revertida para que você não
possa terminar com dados corrompidos no banco de dados, é por
isso que você realmente agrupa todas as consultas em uma transação desse tipo.
Portanto, isso cria uma transação ou inicializa uma transação e fornece acesso a esse
objeto de transação aqui nesta função que será executada para você.
Portanto, aqui, agora podemos usar esse objeto de transação para executar uma consulta SQL com
a ajuda do
método execute SQL, novamente isso também está documentado aqui. Portanto, executar o SQL agora usa uma string que descreve sua consulta SQL
e essa é a parte em que você pode mergulhar
no documento SQL mencionado anteriormente, onde você pode aprender tudo sobre a linguagem SQL.
Agora, quero criar uma tabela aqui que fazemos com o comando create table e você
não precisa escrever
isso em maiúsculas, apenas faço isso para deixar claro que esses são comandos padrão criados na linguagem SQL e quero crie a
tabela se
ela não existir, o que fazemos com a restrição se não existir aqui e agora o nome da tabela
será lugares, em minúsculas,
agora essa é minha coisa dinâmica aqui,
certo, quero nomeá-lo lugares e agora entre parênteses, você configura o que está na tabela e,
posteriormente, pode adicionar um ponto e vírgula.
Portanto, agora definimos os diferentes campos que queremos ter nessa tabela, as diferentes
colunas, por assim dizer, e eu quero ter uma coluna de ID, e configurarei isso para ser do tipo inteiro, que
é um dos tipos de dados
suportados no SQL e será uma chave primária, o que significa que também será forçado a ser exclusivo,
você não pode ter o mesmo ID duas vezes e ele gerará automaticamente esse ID,
o que é muito conveniente e não
deve ser nulo. um valor vazio não será permitido. Agora, com uma vírgula, podemos adicionar a
próxima coluna que queremos ter e esse será o meu título.
Agora, o título deve ser do tipo texto e você também pode adicionar não nulo, se quiser, todos os meus
dados não devem ser nulos, na verdade.
Agora, além do título, também quero ter o imageUri armazenado lá e também é um texto que
não é nulo.
É claro que é um texto e não um arquivo ou algo assim porque não estamos
armazenando o arquivo no banco de dados, estamos armazenando o caminho para o arquivo no
banco de dados que é uma string e agora outra coisa que precisaremos mais tarde Eu também já quero configurar o meu
endereço, que é um texto, que deve ser uma string que descreve o endereço do local e um campo de latitude ou apenas lat,
que é real, que é um número de ponto flutuante no final e o longitude aqui abreviada com lng, que também é real e
nem todas são nulas.
Agora, ainda não estamos buscando o local, mas o faremos mais tarde e expressaremos um local
como uma combinação de latitude e longitude, que é a maneira padrão de expressar pontos no mundo.
Portanto, isso cria uma tabela agora, se ela já não existe.
Agora, o método execute SQL também pega um segundo argumento, que é uma matriz de argumentos que entrarão em jogo mais
tarde, dos quais ainda não precisamos, esses
seriam argumentos dinâmicos que você pode injetar nessa consulta, mas não precisamos disso aqui e
então temos duas funções aqui como argumento número três e quatro. A primeira função pela qual passamos é uma
função de sucesso, que
é executada se esse comando for bem-sucedido.
O segundo argumento é uma função de erro que é executada se isso falhar.
Agora, o primeiro argumento para cada função aqui e essas funções são executadas em seu nome pelo pacote
SQL, é claro, portanto,
essas funções sempre como primeiro argumento recebem basicamente a consulta que você executou e
adicionando um sublinhado como nome aqui, sinalizo que Eu não me importo com
isso, mas estou interessado no segundo argumento
e, aqui, esse seria o meu objeto de erro e, agora, para torná-lo utilizável de uma maneira fácil, na verdade vou envolvê-lo em uma promessa personalizada.
Então, aqui, criarei uma promessa usando uma nova promessa, promessas incorporadas ao Javascript e suportadas pela versão Javascript que o
React Native usa e a promessa assume uma função que aceita uma função de resolução e rejeição como argumento e
agora podemos mover
esse banco de dados código de transação lá e no caso de sucesso, chamo resolver, o que significa que
a promessa externa será resolvida; no caso de erro, chamo rejeitar e encaminhar meu
erro aqui e, em seguida, posso retornar a promessa aqui no
meu método init e agora posso chamar o método init de outros lugares no aplicativo e recebo de
volta uma promessa que resolverá se for bem-sucedido na inicialização do banco de dados,
na criação da tabela ou se ocorrermos um erro. A propósito, se nenhuma tabela for criada porque já
existe, não obteremos um erro, mas ainda assim acabaremos em um caso de sucesso. Portanto, com isso, ainda não estamos armazenando nada no banco de
dados, mas estamos configurando o banco de dados.
Então agora vamos ter certeza de que chamamos init e, claro, o lugar para chamá-lo é o aplicativo. js porque queremos inicializar
o banco de dados o
mais rápido possível quando o aplicativo é iniciado. Então, vou importar algo da minha pasta de ajuda para lá, do arquivo de banco de dados e isso é
algo surpreendente, é a função e, portanto, está aqui quando este aplicativo. O arquivo js é executado, quando também
inicializamos o repositório Redux e assim por diante, eu quero chamar init aqui e agora init é bem-sucedido
ou não, então por enquanto vou adicionar um bloco then onde digo banco de dados inicializado do log do console, então
esse
é o caso de sucesso ou um bloco de captura em que obtemos um erro potencial em que eu consolo falhou
na inicialização do db e onde também console o erro que obtivemos. E se agora salvarmos isso, você deverá ver aqui no banco de dados
inicializado por log, que é a saída do iPhone e agora que foi iniciado no Android, você
também o verá no Android.
Então, isso funciona e agora temos um banco de dados inicializado, agora é hora de adicionar mais métodos para garantir que
também possamos inserir dados e, posteriormente, é claro, buscar dados.