1 00:00:02,100 --> 00:00:05,240 Então, vamos mergulhar no SQLite. Novamente, obtivemos um módulo 2 00:00:05,300 --> 00:00:11,100 para o suportado pelo expo, que instalamos da mesma forma que instalamos os outros módulos 3 00:00:11,130 --> 00:00:12,120 nativos e 4 00:00:12,120 --> 00:00:18,570 agora apenas algumas palavras rápidas sobre o SQLite. O SQLite é um sistema de banco de dados que 5 00:00:18,570 --> 00:00:22,840 você pode dizer que está disponível no iOS e no Android, para que você 6 00:00:22,860 --> 00:00:30,240 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 7 00:00:30,570 --> 00:00:32,860 para executar consultas nesse banco de dados. 8 00:00:32,940 --> 00:00:39,030 Agora, não vou me aprofundar na sintaxe SQL aqui, porque esse obviamente não é um curso sobre 9 00:00:39,030 --> 00:00:41,730 SQL, mas para aprender tudo sobre como usá-lo, 10 00:00:41,730 --> 00:00:50,880 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 11 00:00:50,880 --> 00:00:56,550 em um aplicativo expo, onde você pode ver mais exemplos de como excluir coisas e 12 00:00:56,550 --> 00:01:02,460 assim por diante, e também encontrará uma referência SQL para SQLite, onde pode aprender mais sobre 13 00:01:02,460 --> 00:01:03,990 a sintaxe SQL. 14 00:01:03,990 --> 00:01:06,630 Vou mostrar algumas sintaxe básica agora neste módulo, 15 00:01:06,720 --> 00:01:10,360 mas para todas as coisas que você pode fazer em suas consultas, para 16 00:01:10,470 --> 00:01:17,170 todos os comandos que você pode executar, verifique definitivamente esses recursos. Agora, com isso, vamos adicionar o SQLite executando 17 00:01:17,170 --> 00:01:24,010 expo install expo-sqlite em nosso projeto, que instalará isso em nosso projeto aqui e funcionará imediatamente, como 18 00:01:24,010 --> 00:01:27,250 antes, nenhuma configuração extra é necessária e, 19 00:01:28,510 --> 00:01:32,720 uma vez concluída a instalação, podemos comece a trabalhar com SQLite. 20 00:01:32,830 --> 00:01:35,750 Agora, trabalhar com o banco de dados envolve algumas coisas, por 21 00:01:35,770 --> 00:01:41,020 exemplo, você precisa abrir uma conexão com o banco de dados e, se ainda não existe um banco de dados, o 22 00:01:41,020 --> 00:01:46,260 que ocorre quando você o acessa pela primeira vez durante a vida útil do aplicativo, ele também cria esse banco de 23 00:01:46,450 --> 00:01:51,070 dados e depois de ter essa conexão com o banco de dados criado, é claro que você pode 24 00:01:51,070 --> 00:01:52,090 executar consultas nele. 25 00:01:52,090 --> 00:01:57,310 Então, para isso, adicionarei uma pasta de ajudantes com um banco de dados. arquivo js lá que você não precisa fazer, 26 00:01:57,310 --> 00:02:03,220 mas eu quero ter minha lógica de banco de dados para manter meus outros arquivos magros e para que eu tenha 27 00:02:03,220 --> 00:02:10,210 um arquivo onde possamos ver toda a lógica do banco de dados. Agora, podemos importar o SQLite do pacote e, como você vê, 28 00:02:10,290 --> 00:02:13,810 a sintaxe de importação agora é um pouco diferente da dos outros pacotes. 29 00:02:13,980 --> 00:02:19,320 Em vez de importar a estrela como SQLite deste pacote, instalamos aqui com esta sintaxe de importação 30 00:02:19,320 --> 00:02:20,300 nomeada, além 31 00:02:20,310 --> 00:02:22,180 disso, ainda é muito semelhante e 32 00:02:22,500 --> 00:02:25,110 agora podemos começar a usar esse pacote aqui. 33 00:02:25,260 --> 00:02:31,080 Agora, antes de tudo, criarei uma constante db que contém uma referência ao meu banco de dados que recebo executando o 34 00:02:31,080 --> 00:02:34,290 banco de dados aberto SQLite e lá passamos um nome de 35 00:02:34,290 --> 00:02:39,020 banco de dados que poderia ser um local. db. 36 00:02:39,060 --> 00:02:43,980 Agora, o que isso fará é que ele se conecte a esse banco de dados ou crie o banco de dados, 37 00:02:44,010 --> 00:02:48,990 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 38 00:02:49,080 --> 00:02:50,370 banco de dados. muito trivial. 39 00:02:50,380 --> 00:02:55,110 Agora, essa linha de código será executada sempre que executarmos esse arquivo, o que efetivamente acontece quando 40 00:02:55,170 --> 00:02:57,870 importamos esse arquivo pela primeira vez em qualquer lugar. 41 00:02:57,990 --> 00:03:04,320 Agora eu também quero adicionar uma função init aqui armazenada em uma constante que eu faço para inicializar 42 00:03:04,320 --> 00:03:08,890 esse banco de dados e exportarei essa função como uma exportação nomeada. 43 00:03:08,910 --> 00:03:15,300 Agora, nesta função, quero ter certeza de que criamos uma tabela básica, porque os bancos de dados SQL funcionam com 44 00:03:15,300 --> 00:03:21,450 tabelas que mantêm seus registros e registros são basicamente as linhas de dados que você adiciona à sua tabela. 45 00:03:21,450 --> 00:03:27,420 Agora, inicialmente, quando criamos o banco de dados, ele está vazio, mas para armazenar locais, precisamos de uma tabela 46 00:03:27,420 --> 00:03:29,200 que possa conter esses locais. 47 00:03:29,220 --> 00:03:35,190 Então, eu quero ter uma função de inicialização aqui que realmente criará essa tabela se ela ainda 48 00:03:35,190 --> 00:03:35,900 não existir. 49 00:03:36,690 --> 00:03:44,780 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 50 00:03:44,790 --> 00:03:50,220 banco de dados e você encontrará tudo isso nos documentos oficiais, é claro, 51 00:03:50,220 --> 00:03:51,560 e esse 52 00:03:51,780 --> 00:03:57,570 método de transação funciona como um argumento que fornece acesso ao objeto de transação 53 00:03:57,660 --> 00:03:59,620 que ele cria para você. 54 00:03:59,750 --> 00:04:06,870 O conceito de transações simplesmente é um conceito em que este pacote no final garante que sua consulta seja sempre executada como 55 00:04:06,870 --> 00:04:13,200 um todo e que, se alguma parte da consulta falhar, a consulta inteira será revertida para que você não 56 00:04:13,200 --> 00:04:17,340 possa terminar com dados corrompidos no banco de dados, é por 57 00:04:17,340 --> 00:04:21,670 isso que você realmente agrupa todas as consultas em uma transação desse tipo. 58 00:04:21,750 --> 00:04:26,760 Portanto, isso cria uma transação ou inicializa uma transação e fornece acesso a esse 59 00:04:26,790 --> 00:04:30,830 objeto de transação aqui nesta função que será executada para você. 60 00:04:30,840 --> 00:04:37,890 Portanto, aqui, agora podemos usar esse objeto de transação para executar uma consulta SQL com 61 00:04:37,890 --> 00:04:39,450 a ajuda do 62 00:04:39,450 --> 00:04:48,260 método execute SQL, novamente isso também está documentado aqui. Portanto, executar o SQL agora usa uma string que descreve sua consulta SQL 63 00:04:48,530 --> 00:04:52,500 e essa é a parte em que você pode mergulhar 64 00:04:52,520 --> 00:04:57,450 no documento SQL mencionado anteriormente, onde você pode aprender tudo sobre a linguagem SQL. 65 00:04:57,560 --> 00:05:02,840 Agora, quero criar uma tabela aqui que fazemos com o comando create table e você 66 00:05:02,870 --> 00:05:03,980 não precisa escrever 67 00:05:03,980 --> 00:05:11,600 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 68 00:05:11,600 --> 00:05:12,590 tabela se 69 00:05:12,590 --> 00:05:19,130 ela não existir, o que fazemos com a restrição se não existir aqui e agora o nome da tabela 70 00:05:19,130 --> 00:05:20,750 será lugares, em minúsculas, 71 00:05:20,750 --> 00:05:23,300 agora essa é minha coisa dinâmica aqui, 72 00:05:23,360 --> 00:05:28,760 certo, quero nomeá-lo lugares e agora entre parênteses, você configura o que está na tabela e, 73 00:05:28,760 --> 00:05:31,110 posteriormente, pode adicionar um ponto e vírgula. 74 00:05:31,130 --> 00:05:35,420 Portanto, agora definimos os diferentes campos que queremos ter nessa tabela, as diferentes 75 00:05:35,450 --> 00:05:42,380 colunas, por assim dizer, e eu quero ter uma coluna de ID, e configurarei isso para ser do tipo inteiro, que 76 00:05:42,380 --> 00:05:44,660 é um dos tipos de dados 77 00:05:44,660 --> 00:05:50,360 suportados no SQL e será uma chave primária, o que significa que também será forçado a ser exclusivo, 78 00:05:50,360 --> 00:05:55,400 você não pode ter o mesmo ID duas vezes e ele gerará automaticamente esse ID, 79 00:05:55,400 --> 00:05:57,880 o que é muito conveniente e não 80 00:05:57,890 --> 00:06:03,680 deve ser nulo. um valor vazio não será permitido. Agora, com uma vírgula, podemos adicionar a 81 00:06:03,680 --> 00:06:08,030 próxima coluna que queremos ter e esse será o meu título. 82 00:06:08,030 --> 00:06:14,460 Agora, o título deve ser do tipo texto e você também pode adicionar não nulo, se quiser, todos os meus 83 00:06:14,670 --> 00:06:17,200 dados não devem ser nulos, na verdade. 84 00:06:17,670 --> 00:06:22,860 Agora, além do título, também quero ter o imageUri armazenado lá e também é um texto que 85 00:06:22,860 --> 00:06:24,110 não é nulo. 86 00:06:24,120 --> 00:06:28,950 É claro que é um texto e não um arquivo ou algo assim porque não estamos 87 00:06:29,220 --> 00:06:34,020 armazenando o arquivo no banco de dados, estamos armazenando o caminho para o arquivo no 88 00:06:34,020 --> 00:06:40,530 banco de dados que é uma string e agora outra coisa que precisaremos mais tarde Eu também já quero configurar o meu 89 00:06:40,530 --> 00:06:47,760 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, 90 00:06:47,760 --> 00:06:54,990 que é real, que é um número de ponto flutuante no final e o longitude aqui abreviada com lng, que também é real e 91 00:06:55,050 --> 00:06:56,330 nem todas são nulas. 92 00:06:56,340 --> 00:07:03,090 Agora, ainda não estamos buscando o local, mas o faremos mais tarde e expressaremos um local 93 00:07:03,090 --> 00:07:10,080 como uma combinação de latitude e longitude, que é a maneira padrão de expressar pontos no mundo. 94 00:07:10,110 --> 00:07:14,150 Portanto, isso cria uma tabela agora, se ela já não existe. 95 00:07:14,150 --> 00:07:20,130 Agora, o método execute SQL também pega um segundo argumento, que é uma matriz de argumentos que entrarão em jogo mais 96 00:07:20,130 --> 00:07:22,500 tarde, dos quais ainda não precisamos, esses 97 00:07:22,590 --> 00:07:26,850 seriam argumentos dinâmicos que você pode injetar nessa consulta, mas não precisamos disso aqui e 98 00:07:27,120 --> 00:07:33,810 então temos duas funções aqui como argumento número três e quatro. A primeira função pela qual passamos é uma 99 00:07:33,810 --> 00:07:35,790 função de sucesso, que 100 00:07:36,000 --> 00:07:38,940 é executada se esse comando for bem-sucedido. 101 00:07:38,940 --> 00:07:43,140 O segundo argumento é uma função de erro que é executada se isso falhar. 102 00:07:43,200 --> 00:07:48,930 Agora, o primeiro argumento para cada função aqui e essas funções são executadas em seu nome pelo pacote 103 00:07:48,930 --> 00:07:50,510 SQL, é claro, portanto, 104 00:07:50,520 --> 00:07:54,990 essas funções sempre como primeiro argumento recebem basicamente a consulta que você executou e 105 00:07:55,140 --> 00:07:59,490 adicionando um sublinhado como nome aqui, sinalizo que Eu não me importo com 106 00:07:59,490 --> 00:08:01,740 isso, mas estou interessado no segundo argumento 107 00:08:01,740 --> 00:08:10,130 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. 108 00:08:10,170 --> 00:08:17,100 Então, aqui, criarei uma promessa usando uma nova promessa, promessas incorporadas ao Javascript e suportadas pela versão Javascript que o 109 00:08:17,100 --> 00:08:23,820 React Native usa e a promessa assume uma função que aceita uma função de resolução e rejeição como argumento e 110 00:08:23,910 --> 00:08:25,290 agora podemos mover 111 00:08:25,800 --> 00:08:32,190 esse banco de dados código de transação lá e no caso de sucesso, chamo resolver, o que significa que 112 00:08:32,220 --> 00:08:37,200 a promessa externa será resolvida; no caso de erro, chamo rejeitar e encaminhar meu 113 00:08:37,200 --> 00:08:41,220 erro aqui e, em seguida, posso retornar a promessa aqui no 114 00:08:41,220 --> 00:08:47,400 meu método init e agora posso chamar o método init de outros lugares no aplicativo e recebo de 115 00:08:47,400 --> 00:08:52,220 volta uma promessa que resolverá se for bem-sucedido na inicialização do banco de dados, 116 00:08:52,230 --> 00:08:58,440 na criação da tabela ou se ocorrermos um erro. A propósito, se nenhuma tabela for criada porque já 117 00:08:58,440 --> 00:09:06,680 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 118 00:09:06,680 --> 00:09:10,100 dados, mas estamos configurando o banco de dados. 119 00:09:10,100 --> 00:09:15,260 Então agora vamos ter certeza de que chamamos init e, claro, o lugar para chamá-lo é o aplicativo. js porque queremos inicializar 120 00:09:15,260 --> 00:09:18,060 o banco de dados o 121 00:09:18,140 --> 00:09:25,700 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 é 122 00:09:25,700 --> 00:09:30,620 algo surpreendente, é a função e, portanto, está aqui quando este aplicativo. O arquivo js é executado, quando também 123 00:09:30,750 --> 00:09:37,550 inicializamos o repositório Redux e assim por diante, eu quero chamar init aqui e agora init é bem-sucedido 124 00:09:37,550 --> 00:09:45,380 ou não, então por enquanto vou adicionar um bloco then onde digo banco de dados inicializado do log do console, então 125 00:09:45,770 --> 00:09:46,520 esse 126 00:09:46,550 --> 00:09:54,200 é o caso de sucesso ou um bloco de captura em que obtemos um erro potencial em que eu consolo falhou 127 00:09:54,230 --> 00:10:03,610 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 128 00:10:04,000 --> 00:10:09,880 inicializado por log, que é a saída do iPhone e agora que foi iniciado no Android, você 129 00:10:09,880 --> 00:10:11,920 também o verá no Android. 130 00:10:12,070 --> 00:10:18,610 Então, isso funciona e agora temos um banco de dados inicializado, agora é hora de adicionar mais métodos para garantir que 131 00:10:18,610 --> 00:10:21,820 também possamos inserir dados e, posteriormente, é claro, buscar dados.