Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Persistir o tema utilizando SQLite ao invés do AsyncStorage

Olá! Durante o curso eu fui acompanhando o projeto das aulas, mas também vinha fazendo após as aulas um projeto pessoal, que por acaso também utilizaria de temas claros e escuros. Após o término do curso de Context API eu tentei fazer com que o Tema fosse guardado localmente, assim como no curso, porém tentei utilizar o SQLite para isso pois ja estava utilizando o mesmo para armazenar outros dados localmente, mas não consegui persistir o tema utilizando o SQLite, e fiquei com essa dúvida, teria alguma forma de eu fazer exatamente o que foi feito no curso, porém utilizando o SQLite? Talvez criando uma tabela com um valor padrão (coisa que não consegui fazer)?

2 respostas
solução!

Olá Matheus, tudo bem?

Primeiramente, parabéns por continuar seu aprendizado após o término do curso e por buscar novas formas de persistir os dados localmente em seu projeto pessoal. É muito válido e importante para aprimorar suas habilidades em programação.

Quanto à sua dúvida, é possível utilizar o SQLite para persistir o tema em seu aplicativo. O processo é semelhante ao utilizado com o AsyncStorage, mas com algumas diferenças na implementação.

Para começar, é necessário instalar o pacote SQLite no seu projeto, imagino que essa parte você já tenha, mas para isso, você pode utilizar o seguinte comando no terminal:

npm install --save react-native-sqlite-storage

Após a instalação, você pode criar uma tabela no banco de dados SQLite para armazenar as informações do tema. Por exemplo:

CREATE TABLE theme (
  id INTEGER PRIMARY KEY,
  isDarkMode INTEGER NOT NULL
);

Em seguida, é possível criar uma função que insere ou atualiza o valor do tema na tabela. Algo semelhante a isso:

import SQLite from 'react-native-sqlite-storage';

// Abre a conexão com o banco de dados
const db = SQLite.openDatabase({name: 'my.db'});

// Função que insere ou atualiza o valor do tema na tabela
const saveTheme = (isDarkMode) => {
  db.transaction((tx) => {
    // Executa o comando SQL para inserir ou atualizar o valor do tema
    tx.executeSql(
      'INSERT INTO theme (id, isDarkMode) VALUES (1, ?) ' +
      'ON CONFLICT(id) DO UPDATE SET isDarkMode = ?',
      [isDarkMode, isDarkMode],
      () => { console.log('Tema salvo com sucesso!'); },
      (error) => { console.log('Erro ao salvar tema: ', error); }
    );
  });
};

Nessa função, utilizamos o método executeSql do objeto tx para executar um comando SQL que insere ou atualiza o valor do tema na tabela. O parâmetro ON CONFLICT é utilizado para atualizar o valor do tema caso ele já exista na tabela.

Por fim, você pode criar outra função para recuperar o valor do tema do banco de dados. Algo semelhante a isso:

// Função que recupera o valor do tema do banco de dados
const getTheme = (callback) => {
  db.transaction((tx) => {
    // Executa o comando SQL para recuperar o valor do tema
    tx.executeSql(
      'SELECT isDarkMode FROM theme WHERE id = 1',
      [],
      (_, {rows}) => { callback(rows.item(0).isDarkMode); },
      (error) => { console.log('Erro ao recuperar tema: ', error); }
    );
  });
};

Nessa função, utilizamos o método executeSql do objeto tx para executar um comando SQL que recupera o valor do tema na tabela. O parâmetro callback é uma função que será chamada com o valor do tema recuperado do banco de dados.

Com essas funções, você pode salvar e recuperar o valor do tema no banco de dados SQLite em seu aplicativo. Basta chamar a função saveTheme para salvar o valor do tema e a função getTheme para recuperar o valor do tema em qualquer parte do seu código.

Espero ter ajudado! Se tiver alguma dúvida é só falar!

Olá André, sou muito grato por ter dedicado seu tempo a me ajudar encontrar uma solução para o meu problema!

Eu conseguir resolver, utilizei seu código como base pois ainda encontrei alguns problemas mas nada muito grande, com um pouco de pesquisa consegui encontrar uma forma de resolver o pequeno problema que estava tendo que sabia qual era mas não sabia solucionar, agora esta resolvido! Muito obrigado <3