Comenzando con SQL rápido
Copy a setup prompt with the install steps and the full markdown guide for this plugin.
Set up this Capacitor plugin in the project.
Use the package manager already used by the project.
Install these package(s): `@capgo/capacitor-fast-sql`
Run the required Capacitor sync/update step after installation.
Read this markdown guide for the full setup steps: https://raw.githubusercontent.com/Cap-go/website/refs/heads/main/apps/docs/src/content/docs/es/docs/plugins/fast-sql/getting-started.mdx
Use that guide for platform-specific steps, native file edits, permissions, config changes, imports, and usage setup.
If that guide references other docs pages, read them too.
-
Instalar el paquete
Ventana de terminal npm i @capgo/capacitor-fast-sqlVentana de terminal pnpm add @capgo/capacitor-fast-sqlVentana de terminal yarn add @capgo/capacitor-fast-sqlVentana de terminal bun add @capgo/capacitor-fast-sql -
Sincronización con proyectos nativos
Ventana de terminal npx cap syncVentana de terminal pnpm cap syncVentana de terminal yarn cap syncVentana de terminal bunx cap sync -
Configurar plataformas
Permitir el acceso a la red local en
Info.plist:ios/App/App/Info.plist <key>NSAppTransportSecurity</key><dict><key>NSAllowsLocalNetworking</key><true/></dict>Android
Section titled “Android”Agregue una excepción de texto sin cifrar para el tráfico de host local:
android/app/src/main/AndroidManifest.xml <application android:networkSecurityConfig="@xml/network_security_config">...</application>Instale sql.js como respaldo de almacenamiento web:
Terminal window npm install sql.js
¿Por qué SQL rápido?
Section titled “¿Por qué SQL rápido?”Fast SQL avoids heavy bridge serialization by using a local HTTP transport to native SQLite, which is much faster for large result sets and sync-style writes.
Uso básico
Section titled “Uso básico”import { FastSQL, IsolationLevel, KeyValueStore } from '@capgo/capacitor-fast-sql';
const db = await FastSQL.connect({ database: 'myapp', encrypted: false, readOnly: false,});
await db.execute(` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, created_at INTEGER DEFAULT (strftime('%s', 'now')) )`);
await db.run('INSERT INTO users (name, email) VALUES (?, ?)', ['John', 'john@example.com']);const users = await db.query('SELECT * FROM users');Métodos de conexión principales
Section titled “Métodos de conexión principales”execute(statement, params?)-> devuelve el resultado SQL completoquery(statement, params?)-> devuelverowsrun(statement, params?)-> devuelve{ rowsAffected, insertId }executeBatch(operations)-> devuelve una serie de resultados
import { type SQLBatchOperation } from '@capgo/capacitor-fast-sql';
const rows = await db.query('SELECT * FROM users WHERE email LIKE ?', ['john%']);
const batch: SQLBatchOperation[] = [ { statement: 'INSERT INTO users (name, email) VALUES (?, ?)', params: ['Alice', 'alice@acme.dev'] }, { statement: 'INSERT INTO users (name, email) VALUES (?, ?)', params: ['Bob', 'bob@acme.dev'] },];await db.executeBatch(batch);Transacciones
Section titled “Transacciones”ayudante de devolución de llamada
Section titled “ayudante de devolución de llamada”await db.transaction(async (tx) => { await tx.run('UPDATE accounts SET balance = balance - 100 WHERE id = ?', [1]); await tx.run('UPDATE accounts SET balance = balance + 100 WHERE id = ?', [2]);});control explícito
Section titled “control explícito”import { IsolationLevel } from '@capgo/capacitor-fast-sql';
await db.beginTransaction(IsolationLevel.Serializable);try { await db.run('UPDATE wallets SET points = points - 1 WHERE user_id = ?', [42]); await db.commit();} catch (error) { await db.rollback(); throw error;}Niveles de aislamiento admitidos:
ReadUncommittedReadCommittedRepeatableReadSerializable
Datos binarios (BLOB)
Section titled “Datos binarios (BLOB)”const imageData = new Uint8Array([0xFF, 0xD8, 0xFF, 0xE0]);await db.run('INSERT INTO assets (name, data) VALUES (?, ?)', ['avatar', imageData]);
const rows = await db.query('SELECT data FROM assets WHERE name = ?', ['avatar']);const retrieved = rows[0].data; // Uint8ArrayCifrado y modos de solo lectura
Section titled “Cifrado y modos de solo lectura”const secureDb = await FastSQL.connect({ database: 'secure_db', encrypted: true, encryptionKey: 'replace-with-a-strong-key',});
const readOnlyDb = await FastSQL.connect({ database: 'public_db', readOnly: true,});En Android, el modo cifrado utiliza SQLCipher; incluir dependencia en la aplicación build.gradle.
Almacén de valores clave
Section titled “Almacén de valores clave”KeyValueStore es un contenedor conveniente para datos de clave/valor móviles.
import { KeyValueStore } from '@capgo/capacitor-fast-sql';
const kv = await KeyValueStore.open({ database: 'kv', store: 'session', encrypted: true, encryptionKey: 'super-secret-key',});
await kv.set('session', { token: 'abc', expiresAt: Date.now() + 3600_000 });const session = await kv.get('session');await kv.has('session');await kv.keys();await kv.remove('session');await kv.clear();await kv.close();Ciclo de vida de la conexión
Section titled “Ciclo de vida de la conexión”await FastSQL.disconnect('myapp');await FastSQL.disconnectAll();const openDatabases = FastSQL.getOpenDatabases();const same = FastSQL.getConnection('myapp');Manejo de errores
Section titled “Manejo de errores”try { await FastSQL.connect({ database: 'myapp' }); await db.query('SELECT * FROM unknown_table');} catch (error) { console.error('Fast SQL error:', error);}Patrones SQL comunes
Section titled “Patrones SQL comunes”Comprobar si existe la tabla
Section titled “Comprobar si existe la tabla”const result = await db.query( "SELECT name FROM sqlite_master WHERE type='table' AND name=?", ['users']);
const tableExists = result.length > 0;Obtener esquema de tabla
Section titled “Obtener esquema de tabla”const schema = await db.query('PRAGMA table_info(users)');console.log('Columns:', schema);Contar filas
Section titled “Contar filas”const result = await db.query('SELECT COUNT(*) as count FROM users');const count = result[0].count;Paginación
Section titled “Paginación”const pageSize = 20;const page = 1;const offset = (page - 1) * pageSize;
const users = await db.query( 'SELECT * FROM users ORDER BY created_at DESC LIMIT ? OFFSET ?', [pageSize, offset]);Consejos de rendimiento
Section titled “Consejos de rendimiento”- Utilice Transacciones para operaciones múltiples: significativamente más rápido que las confirmaciones individuales
- Utilice operaciones por lotes para inserciones masivas: más eficientes que los bucles
- Crear índices en columnas consultadas con frecuencia
- Utilice declaraciones preparadas con parámetros (?): evita la inyección de SQL y mejora el rendimiento
- Utilice el protocolo HTTP directamente para conjuntos de resultados muy grandes
- Cerrar conexiones cuando no esté en uso para liberar recursos
Próximos pasos
Section titled “Próximos pasos”Consulte el tutorial completo para conocer patrones avanzados que incluyen:
- Arquitectura del servicio de base de datos.
- Sistemas de migración
- Sincronizar motores
- Consultas complejas y uniones.
- Optimización del rendimiento