Olá, estudante! Nesta lição, você será apresentado às formas e utilidades do armazenamento de dados em dispositivos móveis de acordo com as características de seu aplicativo. Pode ser que ao ler essa afirmação você se pergunte: sempre irei precisar de armazenar dados, independentemente do meu aplicativo? E a resposta é sim! Pois mesmo que seu aplicativo não armazene dados gerados pelo usuário, você provavelmente quer dar à pessoa que utilizará o seu aplicativo uma área de autenticação para prover segurança durante o uso do aplicativo.
Para isso, você poderá simplesmente utilizar o mecanismo de armazenamento de perfil de usuário, ou em React Native, os chamados hooks, e se for o caso de persistência (sinônimo de armazenamento de dados), você poderá optar salvar em arquivos simples, linha a linha, no armazenamento interno do dispositivo de seu usuário, ou até mesmo no armazenamento externo (SD Cards). Ainda, se somente os arquivos de texto não forem suficientes, você pode criar arquivos estruturados utilizando a notação JSON – JavaScript Object Notation (Notação de Objetos JavaScript). Se mesmo assim ainda houver uma necessidade de dados mais estruturados, você pode optar pelo armazenamento em banco de dados local utilizando o SQLite, por exemplo.
Portanto, o objetivo desta lição é lhe apresentar as diversas formas e quais utilizar quando for armazenar dados em dispositivos móveis através de seus aplicativos.
Imagine que você criou um aplicativo para armazenar a lista de compras do supermercado de seus pais/familiares. Legal, não é mesmo? Com certeza, eles irão ficar muito orgulhosos de seu desempenho e vendo que seus estudos já estão produzindo frutos, não é?
Mas a situação em questão é que se nada for armazenado, quando seus pais fecharem o aplicativo após escreverem todos os itens que deverão ser adquiridos naquela compra, ao chegarem no supermercado e abri-lo novamente, estará tudo em branco. Ou seja, o objetivo e a razão de existir do aplicativo não terá sido atendida corretamente.
Por essa e outras razões, o armazenamento de dados em dispositivos móveis através do uso de aplicativos é uma real necessidade para todos os tipos de aplicações, pois você quer salvar seu desempenho em jogos digitais. Ou então, imagine algo específico, como foi o exemplo do aplicativo de lista de compras. É um problema real a necessidade de armazenamento de dados por parte dos aplicativos, e cabe a você, agora, entender caso a caso qual a melhor técnica e tipo de armazenamento de acordo com a função de seu aplicativo, necessidade de conferência de dados, compartilhamento entre usuários e/ou dispositivos etc.
Hoje você irá conhecer o case fictício da desenvolvedora Joana, que iniciou seus estudos em relação ao desenvolvimento de aplicativos móveis e já está com seu primeiro projeto freelance – que é quando você é contratado(a) sem precisar ter uma empresa ou, minimamente, como MEI – Microempreendedor Individual.
Pois bem, logo no seu primeiro projeto, Joana foi contratada para desenvolver um aplicativo para registrar as tarefas do dia a dia, muito conhecido no meio de desenvolvimento com o termo To do List (lista de tarefas) – que é um aplicativo muito simples no qual o usuário vai registrando suas tarefas e colocando-as, à medida que vai realizando-as, como finalizadas, sabendo assim o progresso durante seu dia, semana ou mês. Tarefa simples para Joana, que dedicou o último ano todo estudando sobre desenvolvimento de aplicativos!
Uma das condições primordiais destacadas pelo cliente era que o aplicativo fosse com autenticação, ou seja, cada pessoa que fosse utilizar iria precisar criar um usuário, para, na sequência, efetuar seu login. Essa exigência visava que o usuário pudesse personalizar o aplicativo em aspectos como cor de fundo da lista e cor da fonte, assim como o tipo de fonte para a escrita das tarefas.
Sabendo das várias formas de armazenamento de dados em dispositivo móveis, Joana dividiu essa questão em duas partes: a primeira com relação à criação de login de usuário, em que ela utilizou o armazenamento em banco de dados local, pois poderia haver vários usuários utilizando aquele aplicativo, e, na segunda parte, com relação à personalização, utilizou o armazenamento de perfil do usuário, com chave-valor, para armazenar as preferência, pois, no caso, as três personalizações por usuário seriam mais rápidas e menos custosas computacionalmente por meio dessa forma. Com este case, você consegue perceber a importância do armazenamento, não é mesmo?
Você irá conhecer agora os conceitos de cada um dos tipos de armazenamento de dados em dispositivos móveis para entender melhor suas características e suas necessidades, para que, assim, possa escolher a melhor opção quando for desenvolver seus aplicativos.
Em todos os dispositivos móveis, existe o que chamamos de memória interna, que nada mais é do que o espaço de armazenamento que se tem disponível para instalação de aplicativos, configurações e, principalmente, o armazenamento de fotos e arquivos que podem ser criados e/ou baixados por nós, ou simplesmente salvos e criados pelos aplicativos desenvolvidos.
Esse armazenamento é feito através de diferentes formas, o que chamamos de Sistemas de arquivo do sistema operacional. P por exemplo, no computador que tem o sistema operacional Windows, a Microsoft utiliza em suas versões mais modernas o formato NTFS – New Technology File System – que foi introduzido com o Windows NT e hoje é utilizado nas atuais versões do sistema operacional.
Já nos dispositivos móveis – que é o que interessa mais a você nesta disciplina –, temos o Android, que a partir da versão 13 utiliza um novo formato justamente para economizar espaço, e passará a utilizar o formato EROFS, da empresa Huawei, ao invés do formato EXT4. E claro, os dispositivos da Apple, os iPhones, utilizam um formato específico desenvolvido dentro da própria empresa, que é o APFS – Apple File System.
Como você pode conhecer no case dessa lição, o armazenamento em mecanismos de perfil de usuário é uma solução de armazenamento muito boa, prática e rápida quando se quer salvar dados pequenos que dizem respeito principalmente a configurações iniciais e automáticas da aplicação, assim como personalização de temas, cores, fontes e a famosa função ao se realizar o login, – manter-se conectado –, na qual você realiza em seu smartphone o login uma única vez e depois pode acessar livremente o aplicativo até que, por sua opção, efetue o logout.
Outro uso interessante de mecanismos de perfil de usuário é a utilização dos chamados Hooks. Segundo React Org (2023), você pode extrair lógica com estado de um componente de uma forma que possa ser testada independentemente e reutilizada, pois eles permitem reutilizar lógica com estado sem mudar sua hierarquia de componentes.
Na prática, compartilha estado de componentes, o que significa que posso facilmente armazenar e recuperar dados do usuário que está “logado”, por exemplo, na aplicação, assim como o horário que foi feito o login para exibir a informação de “usuário logado às x horas e y minutos” e, na grande maioria das vezes, simplesmente capturar alguma informação de um componente para utilizar em outro, ou seja, compartilhar dados entre os componentes – conforme já citado anteriormente.
Exemplo Armazenamento em mecanismos de perfil de usuário
Conforme já citado em outros momentos, o armazenamento local de dados em dispositivos móveis possui uma peculiaridade que é no que diz respeito ao armazenamento interno e externo no caso dos dispositivos Android, uma vez que os Iphones não possuem a opção de inclusão de cartões de memória. Sendo assim, o armazenamento externo é um importante recurso quando queremos “escrever” algo para ser recuperado no futuro de acordo com a necessidade do aplicativo.
O que poderíamos escrever nesses tipos de armazenamento? Lembrando que são arquivos de textos normais onde a escrita e leitura se dá linha a linha, então, não se tem uma estruturação específica, o que nos dá as seguintes características: velocidade na escrita ou armazenamento e mais lentidão na leitura ou recuperação desse dados, de novo, por conta da leitura linha a linha do arquivo texto.
É um formato usado em casos bem simples por conta dessa características, principalmente pela grande dificuldade de manutenção futura devido a essa não estruturação. Ouso repetir o mesmo exemplo da utilização de Hooks citado neste item que é o armazenamento do horário de login de um usuário para, a partir desse dado, calcular o tempo de permanência “logado” no aplicativo, um arquivo de uma única linha que não precisaria de estruturação etc.
Uma vez que você precise armazenar dados intermediários, que não seriam simples a ponto de utilizar um arquivo de texto ou hooks e nem tão complexos e estruturados a ponto de serem persistidos em um banco de dados local, você ainda tem a opção de armazenamento em arquivos estruturados que são os arquivos do tipo JSON – JavaScript Object Notation (notação de objetos JavaScript). Os JSON são arquivos com estrutura definida de chave-valor, em que você pode estruturar dados através de listas, como, por exemplo, para salvar uma lista de tarefas com sua descrição, prazo e se está realizada ou não.
Também se consegue, nesses arquivos, a criação de hierarquia, como primeiramente ter os dados do usuário “logado” e, na sequência, uma lista de tarefas a serem feitas (por isso o nome da categoria de arquivos estruturados). Você poderá ter uma ideia do que foi citado aqui na Figura 2 com um exemplo de Arquivo JSON.
Exemplo de armazenamento em arquivo estruturado
A ordenação dos itens sobre armazenamento, em dispositivos móveis, não foi realizada aleatoriamente, foi disponibilizada de acordo com complexidade dos dados a serem armazenados e, por consequência, recuperados. Sendo assim, agora, você conhecerá a opção de armazenamento em banco de dados local através do SGBD – Sistema Gerenciador de Banco de Dados – chamado SQLite, que é uma biblioteca que implementa um mecanismo de banco de dados SQL transacional, independente, sem servidor, sem configuração. Seu código é de domínio público, portanto é gratuito para usar em qualquer finalidade, ou seja, de forma comercial ou privada. Esse é o banco de dados mais implantado no mundo, com mais aplicativos do que podemos contar, incluindo vários projetos de alto nível.
Mas o que você entende quando lê o termo dados complexos? Bom, podemos dizer que são dados cuja estruturação a serem armazenados tem derivações e não se é possível descrevê-las em um arquivo estruturado, somente a ponto de ter a informação que se deve utilizar no banco de dados.
Por exemplo: Você tem em seu aplicativo os dados de usuários e, dentre eles, você sempre pede a cidade na qual o usuário reside. Agora, pense bem quantos usuários que utilizam seu aplicativo moram na mesma cidade? Principalmente se o aplicativo tem o alcance regional, por exemplo.
Todas as vezes que o usuário for realizar o cadastro terá que digitar o nome da cidade? Não seria melhor ele poder selecionar o nome da cidade em uma lista de cidades possíveis e, depois, você associar a cidade ao usuário cadastrado? Então, nessas ocasiões, o uso de banco de dados, no caso, local é o mais indicado, pois você teria uma tabela com dados das cidades com um código de identificação, nome e UF dessa cidade, e outra tabela somente com os dados de usuário, por exemplo: código de identificação do usuário, nome do usuário, documento do usuário, e-mail do usuário e o código da cidade do usuário; código este da cidade que terá ligação com a tabela cidade, e que tornará possível a exibição do nome da cidade do usuário em caso de necessidade no aplicativo.
Falei aqui para você de uma tabela “ligada” a outra, mas, dependendo da estrutura de seu aplicativo, poderíamos estar falando de várias tabelas, como cinco ou dez, e, por isso, dentro de sua necessidade, o banco dados em questão, o SQLite, lhe atenderá perfeitamente.
Exemplo de Armazenamento em banco de dados local
Agora que você já conhece algumas das possíveis formas de armazenamento de dados em aplicativos móveis, como irá utilizar essa informação?
Pois bem, aqui, para a aplicação desse conhecimento, cabe a máxima explicada em cada categoria no item conceitualização desta aula: irá depender da necessidade e da característica de seu aplicativo.
Uma das formas que você pode utilizar de aplicação para os tipos de armazenamento apresentados é: sempre que for dados de usuário “logado” e compartilhamento de estado entre componentes, você pode utilizar os async storage, hooks e até mesmo arquivos, dependendo da quantidade. Mas, como assim, dependendo da quantidade? Exemplo: você trabalha com todos esses tipos citados agora, dados de usuários e compartilhamento de dados entre componentes. Então, seria o caso de utilizar uma alternativa somente que já abrangesse as duas necessidades, no caso, o async storage para persistir os dados sempre que necessário.
Tem uma estrutura de dados complexa, mas é de pouco volume e que não tem a complexidade do tipo repetição de dados que faria a necessidade de separação em várias tabelas e, por consequência, utilização de banco de dados. Utilize, então, os arquivos estruturados JSON, que lhe atenderão perfeitamente e terão um melhor custo-benefício.
Agora, se o aplicativo nos obriga a ter dados salvos compartilhados entre vários itens, aí, sim, o banco de dados é a melhor opção devido a sua estrutura e ferramentas para que esses dados sejam armazenados com a velocidade e consistência necessária para que seu usuário tenha uma ótima experiência ao utilizar seu aplicativo.
REACT ORG. Introdução aos Hooks. 2022. Disponível em: https://pt-br.reactjs.org/docs/hooks-intro.html#motivation. Acesso em: 20 jan. 2023