224 lines
6.2 KiB
Markdown
224 lines
6.2 KiB
Markdown
|
|
# CORREÇÃO SQLITE BASEADA NA DOCUMENTAÇÃO OFICIAL EXPO
|
||
|
|
|
||
|
|
## 🎯 **PROBLEMA IDENTIFICADO**
|
||
|
|
|
||
|
|
Baseado na [documentação oficial do Expo SQLite](https://docs.expo.dev/versions/latest/sdk/sqlite/), o problema era que estávamos usando a **API antiga** do SQLite:
|
||
|
|
|
||
|
|
**❌ API ANTIGA (Deprecated):**
|
||
|
|
```typescript
|
||
|
|
SQLite.openDatabase() // ❌ Não existe mais
|
||
|
|
db.transaction() // ❌ Não existe mais
|
||
|
|
tx.executeSql() // ❌ Não existe mais
|
||
|
|
```
|
||
|
|
|
||
|
|
**✅ API NOVA (Atual):**
|
||
|
|
```typescript
|
||
|
|
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:**
|
||
|
|
```typescript
|
||
|
|
db = SQLite.openDatabase("truckdelivery.db");
|
||
|
|
```
|
||
|
|
|
||
|
|
**DEPOIS:**
|
||
|
|
```typescript
|
||
|
|
db = await SQLite.openDatabaseAsync("truckdelivery.db");
|
||
|
|
```
|
||
|
|
|
||
|
|
### **2. ✅ Teste do Banco**
|
||
|
|
**ANTES:**
|
||
|
|
```typescript
|
||
|
|
db.transaction((tx) => {
|
||
|
|
tx.executeSql("SELECT name FROM sqlite_master WHERE type='table' LIMIT 1;", [], ...);
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
**DEPOIS:**
|
||
|
|
```typescript
|
||
|
|
await db.execAsync(`
|
||
|
|
PRAGMA journal_mode = WAL;
|
||
|
|
SELECT name FROM sqlite_master WHERE type='table' LIMIT 1;
|
||
|
|
`);
|
||
|
|
```
|
||
|
|
|
||
|
|
### **3. ✅ Execução de Queries**
|
||
|
|
**ANTES:**
|
||
|
|
```typescript
|
||
|
|
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:**
|
||
|
|
```typescript
|
||
|
|
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:**
|
||
|
|
```typescript
|
||
|
|
db.transaction((tx) => {
|
||
|
|
tx.executeSql("CREATE TABLE IF NOT EXISTS users (...);");
|
||
|
|
tx.executeSql("CREATE TABLE IF NOT EXISTS deliveries (...);");
|
||
|
|
// ... múltiplas chamadas
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
**DEPOIS:**
|
||
|
|
```typescript
|
||
|
|
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](https://docs.expo.dev/versions/latest/sdk/sqlite/):
|
||
|
|
|
||
|
|
### **Importação Correta:**
|
||
|
|
```typescript
|
||
|
|
import * as SQLite from 'expo-sqlite';
|
||
|
|
```
|
||
|
|
|
||
|
|
### **Abertura do Banco:**
|
||
|
|
```typescript
|
||
|
|
const db = await SQLite.openDatabaseAsync('databaseName');
|
||
|
|
```
|
||
|
|
|
||
|
|
### **Execução de Queries:**
|
||
|
|
```typescript
|
||
|
|
// 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!** 🚀
|
||
|
|
|
||
|
|
## 🔗 **LINKS ÚTEIS**
|
||
|
|
|
||
|
|
- [Documentação Oficial Expo SQLite](https://docs.expo.dev/versions/latest/sdk/sqlite/)
|
||
|
|
- [Expo SQLite GitHub](https://github.com/expo/expo/tree/main/packages/expo-sqlite)
|
||
|
|
- [Expo SQLite Changelog](https://github.com/expo/expo/blob/main/packages/expo-sqlite/CHANGELOG.md)
|