6.2 KiB
6.2 KiB
CORREÇÃO SQLITE BASEADA NA DOCUMENTAÇÃO OFICIAL EXPO
🎯 PROBLEMA IDENTIFICADO
Baseado na documentação oficial do Expo SQLite, o problema era que estávamos usando a API antiga do SQLite:
❌ API ANTIGA (Deprecated):
SQLite.openDatabase() // ❌ Não existe mais
db.transaction() // ❌ Não existe mais
tx.executeSql() // ❌ Não existe mais
✅ API NOVA (Atual):
SQLite.openDatabaseAsync() // ✅ Nova API assíncrona
db.execAsync() // ✅ Para queries em lote
db.runAsync() // ✅ Para INSERT/UPDATE/DELETE
db.getAllAsync() // ✅ Para SELECT
✅ CORREÇÕES IMPLEMENTADAS
1. ✅ Inicialização do Banco
ANTES:
db = SQLite.openDatabase("truckdelivery.db");
DEPOIS:
db = await SQLite.openDatabaseAsync("truckdelivery.db");
2. ✅ Teste do Banco
ANTES:
db.transaction((tx) => {
tx.executeSql("SELECT name FROM sqlite_master WHERE type='table' LIMIT 1;", [], ...);
});
DEPOIS:
await db.execAsync(`
PRAGMA journal_mode = WAL;
SELECT name FROM sqlite_master WHERE type='table' LIMIT 1;
`);
3. ✅ Execução de Queries
ANTES:
const executeQuery = async (query: string, params: any[] = []): Promise<any> => {
return new Promise((resolve, reject) => {
db.transaction((tx) => {
tx.executeSql(query, params, (tx, results) => {
resolve(results);
}, reject);
}, reject);
});
};
DEPOIS:
const executeQuery = async (query: string, params: any[] = []): Promise<any> => {
try {
// Para queries SELECT, usar getAllAsync
if (query.trim().toUpperCase().startsWith('SELECT')) {
const result = await db.getAllAsync(query, params);
return {
rows: {
_array: result,
length: result.length
}
};
}
// Para outras queries (INSERT, UPDATE, DELETE), usar runAsync
const result = await db.runAsync(query, params);
return {
rows: {
_array: [],
length: 0
},
insertId: result.lastInsertRowId,
rowsAffected: result.changes
};
} catch (error) {
console.error("❌ Erro ao executar query:", error);
throw error;
}
};
4. ✅ Criação de Tabelas
ANTES:
db.transaction((tx) => {
tx.executeSql("CREATE TABLE IF NOT EXISTS users (...);");
tx.executeSql("CREATE TABLE IF NOT EXISTS deliveries (...);");
// ... múltiplas chamadas
});
DEPOIS:
await db.execAsync(`
PRAGMA journal_mode = WAL;
-- Tabela de usuários
CREATE TABLE IF NOT EXISTS users (...);
-- Tabela de entregas
CREATE TABLE IF NOT EXISTS deliveries (...);
-- ... todas as tabelas em uma única execução
`);
🔍 LOGS ESPERADOS AGORA
Cenário de Sucesso:
LOG === INICIANDO SQLITE COM EXPO-SQLITE ===
LOG 🔍 Verificando SQLite.openDatabaseAsync...
LOG 🗄️ Abrindo banco de dados...
LOG 🧪 Testando banco de dados...
LOG ✅ Teste do banco bem-sucedido
LOG ✅ SQLite (expo-sqlite) inicializado com sucesso!
LOG === LIMPANDO DADOS ANTIGOS DO ASYNCSTORAGE ===
LOG ✅ Nenhum dado antigo encontrado no AsyncStorage
LOG ✅ Banco de dados SQLite configurado com sucesso
Propriedades Disponíveis no SQLite:
LOG ❌ SQLite disponível: [
"SQLiteDatabase",
"defaultDatabaseDirectory",
"bundledExtensions",
"openDatabaseAsync", ← ✅ Esta é a função correta
"openDatabaseSync",
"deserializeDatabaseAsync",
"deserializeDatabaseSync",
"deleteDatabaseAsync",
"deleteDatabaseSync",
"backupDatabaseAsync",
"backupDatabaseSync",
"addDatabaseChangeListener",
"SQLiteSession",
"SQLiteStatement",
"SQLiteProvider",
"useSQLiteContext",
"importDatabaseFromAssetAsync",
"deepEqual"
]
📚 REFERÊNCIA DA DOCUMENTAÇÃO
Baseado na documentação oficial do Expo SQLite:
Importação Correta:
import * as SQLite from 'expo-sqlite';
Abertura do Banco:
const db = await SQLite.openDatabaseAsync('databaseName');
Execução de Queries:
// Para queries em lote
await db.execAsync(`
PRAGMA journal_mode = WAL;
CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL);
`);
// Para operações de escrita
const result = await db.runAsync('INSERT INTO test (value) VALUES (?)', 'test1');
console.log(result.lastInsertRowId, result.changes);
// Para consultas
const allRows = await db.getAllAsync('SELECT * FROM test');
🚨 COMPORTAMENTO CRÍTICO
- ✅ API Atualizada: Usa a nova API assíncrona do Expo SQLite
- ✅ Compatibilidade: Funciona com Expo SDK 53+
- ✅ Performance:
execAsync()é mais eficiente para queries em lote - ✅ Type Safety: Melhor tipagem com TypeScript
- ✅ Error Handling: Tratamento de erros mais robusto
🧪 TESTE AGORA
- Reinicie o aplicativo para aplicar as mudanças
- Verifique os logs - deve mostrar
✅ SQLite (expo-sqlite) inicializado com sucesso! - Teste login e carga de dados
- Confirme que os dados são salvos no SQLite
- Verifique que não há mais erros de
openDatabase
📋 RESUMO DAS CORREÇÕES
- ✅ Atualizada para
SQLite.openDatabaseAsync() - ✅ Substituído
db.transaction()pordb.execAsync() - ✅ Implementado
db.getAllAsync()para SELECT - ✅ Implementado
db.runAsync()para INSERT/UPDATE/DELETE - ✅ Adicionada tabela
settingsque estava faltando - ✅ Melhorado tratamento de erros
- ✅ Baseado na documentação oficial do Expo
O sistema agora usa a API correta do Expo SQLite conforme a documentação oficial! 🚀