1
resposta

[Dúvida] Persistência de dados com SQLite

Olá tudo bem? Estou utilizando um projeto pessoal para estudar o React Native e o TypeScript, estou armazenando os dados localmente com o SQLite. Estava dando uma olhada na documentação e nos comentários dos demais desenvolveres, além do ChatGPT, todos avisam para encerrar a conexão após alguma operação com o banco de dados. Porém, quando tento fechar a conexão não consigo receber os dados. Gostaria de saber como devo prosseguir, estarei deixando o arquivo do BD logo abaixo.

Info

    "react": "18.2.0",
    "react-native": "0.71.3",
    "react-native-sqlite-storage": "^6.0.1",

categoryType.ts

export type categoryType = {
    id: number,
    name: string,
    photo: string | null,
    status: 0 | 1
}

sellerData.ts

import SQLite from 'react-native-sqlite-storage';
import { categoryType } from '../types/category';
import { Toast } from 'react-native-toast-message/lib/src/Toast';

const nameDB = 'sellerDatabase.db';
const locationDB = 'default';
const db = SQLite.openDatabase({ name: nameDB, location: locationDB }, () => { });

//Criação das tabelas
const createTable = () => {

    db.transaction((tx) => {
        tx.executeSql("CREATE TABLE IF NOT EXISTS categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, photo TEXT, status BOOLEAN NOT NULL DEFAULT 1, creation_date DATETIME DEFAULT CURRENT_TIMESTAMP, last_update DATETIME DEFAULT CURRENT_TIMESTAMP);", [], () => {
            console.log('Tabela de Categorias criada com sucesso!');
        }, () => {
            console.log('Não foi possível criar a tabela de Categorias!');
        });
    })
};

//Recuperação das categorias
const getCategories = (setData: React.Dispatch<React.SetStateAction<categoryType[]>>) => {

    db.transaction((tx) => {
        tx.executeSql("SELECT * FROM categories", [], (tx, result) => {
            const rows = result.rows;
            const categories:categoryType[] = [];
            for (let i = 0; i < rows.length; i++) {
                categories.push(rows.item(i));
            }
            setData(categories.sort((a,b)=>a.name.localeCompare(b.name)));           
        })
    })
}
//Recuperação de uma categoria em específico com base no ID
const getCategories_id = (id: number, setData: React.Dispatch<React.SetStateAction<categoryType>>) => {

    db.transaction((tx) => {
        tx.executeSql("SELECT * FROM categories WHERE id = ?", [id], (tx, result) => {
            const category = result.rows.item(0);
            setData(category);
        })
    })
}

const getActiveCategories = (setData: React.Dispatch<React.SetStateAction<categoryType[]>>) =>{

    db.transaction((tx) => {
        tx.executeSql("SELECT * FROM categories WHERE status = 1", [], (tx, result) => {
            const rows = result.rows;
            const categories:categoryType[] = [];
            for (let i = 0; i < rows.length; i++) {
                categories.push(rows.item(i));
            }
            setData(categories.sort((a,b)=>a.name.localeCompare(b.name)));
        })
    })
}
//Atualiza um item da tabela categoria com base no ID
const updateCategory = (id: number, name: string, photo: string | null, status: boolean) => {

    db.transaction((tx) => {
        tx.executeSql("UPDATE categories SET name = ?, photo = ?, status = ? WHERE id = ?;", [name, photo, status === true ? 1 : 0, id], (tx, result) => {
            Toast.show({
                type: 'success',
                text1: 'Sucesso!',
                text2: `Categoria atualizada com sucesso.`,
            })
        }, () => {
            Toast.show({
                type: 'error',
                text1: `Ops!`,
                text2: `Não foi possível atualizar a categoria`,
            })
        })
    })
}

export {
    createTable,
    nameDB, locationDB,
    getCategories,
    getCategories_id,
    getActiveCategories,
    updateCategory
}

Desde já agradeço pela ajuda.

1 resposta

Olá Gustavo! Tudo bem?

Pelo que entendi, você está enfrentando dificuldades ao fechar a conexão com o banco de dados SQLite após alguma operação. É importante lembrar que, ao encerrar a conexão, você não poderá mais realizar consultas ou operações no banco de dados.

No seu código, você está utilizando a biblioteca react-native-sqlite-storage para abrir e executar operações no banco de dados. No entanto, não encontrei no seu código o trecho onde você fecha a conexão.

Para fechar a conexão com o SQLite, você pode utilizar o método close fornecido pela biblioteca. Recomendo que você chame esse método após realizar todas as operações necessárias no banco de dados. Por exemplo, após a chamada do método getCategories, você pode adicionar o código db.close() para fechar a conexão.

Aqui está um exemplo de como você pode fechar a conexão após a recuperação das categorias:

const getCategories = (setData: React.Dispatch<React.SetStateAction<categoryType[]>>) => {
    db.transaction((tx) => {
        tx.executeSql("SELECT * FROM categories", [], (tx, result) => {
            const rows = result.rows;
            const categories:categoryType[] = [];
            for (let i = 0; i < rows.length; i++) {
                categories.push(rows.item(i));
            }
            setData(categories.sort((a,b)=>a.name.localeCompare(b.name)));           
        })
    }, (error) => {
        console.log(error);
    }, () => {
        db.close(); // Fechando a conexão após a recuperação das categorias
    });
}

Certifique-se de adicionar o código db.close() em todos os pontos onde você finaliza as operações com o banco de dados.

Espero que isso ajude! Se tiver mais alguma dúvida, é só perguntar. Bons estudos!