entregas_app/docs/CORRECAO_SQLITE_API_OFICIAL.md

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

  1. Reinicie o aplicativo para aplicar as mudanças
  2. Verifique os logs - deve mostrar ✅ SQLite (expo-sqlite) inicializado com sucesso!
  3. Teste login e carga de dados
  4. Confirme que os dados são salvos no SQLite
  5. Verifique que não há mais erros de openDatabase

📋 RESUMO DAS CORREÇÕES

  1. Atualizada para SQLite.openDatabaseAsync()
  2. Substituído db.transaction() por db.execAsync()
  3. Implementado db.getAllAsync() para SELECT
  4. Implementado db.runAsync() para INSERT/UPDATE/DELETE
  5. Adicionada tabela settings que estava faltando
  6. Melhorado tratamento de erros
  7. Baseado na documentação oficial do Expo

O sistema agora usa a API correta do Expo SQLite conforme a documentação oficial! 🚀