Expo SQLite报错:SQLiteDatabase无transaction及openDatabase方法
Expo 51 + expo-sqlite 14.x 常见API错误解决
问题根源
Expo 51对应的expo-sqlite 14.x版本完全重构了API,采用异步优先设计,移除了旧版的同步openDatabase和transaction方法,类型定义也同步更新,导致旧代码触发类型错误。
具体解决方案
1. 替换openDatabase为异步初始化方法
旧代码的同步初始化已被移除,改用以下两种方式:
方式一:异步函数初始化
import * as SQLite from 'expo-sqlite'; async function initDatabase() { // 异步打开数据库 const db = await SQLite.openDatabaseAsync('tasks.db'); // 示例:执行建表操作 await db.execAsync(` CREATE TABLE IF NOT EXISTS tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL ); `); return db; } // 在需要的地方调用初始化 // const db = await initDatabase();
方式二:React Hook(推荐在组件内使用)
import { useSQLite } from 'expo-sqlite'; function TaskManager() { // 自动处理数据库实例的生命周期 const db = useSQLite('tasks.db'); // 后续操作见下方事务处理 }
2. 替换db.transaction为异步事务方法
旧的同步transaction已被异步的transactionAsync替代,需配合async/await使用:
async function addNewTask(title) { try { await db.transactionAsync(async (tx) => { // 执行SQL操作 await tx.runAsync('INSERT INTO tasks (title) VALUES (?)', [title]); }); console.log('任务添加成功'); } catch (error) { console.error('添加任务失败:', error); } }
3. 修正类型定义
如果使用TypeScript,注意数据库实例的类型已从SQLite.SQLiteDatabase(同步)改为SQLite.AsyncSQLiteDatabase(异步):
import * as SQLite from 'expo-sqlite'; class TaskService { db: SQLite.AsyncSQLiteDatabase; constructor(db: SQLite.AsyncSQLiteDatabase) { this.db = db; } // 示例方法 async getTasks() { const result = await this.db.getAllAsync('SELECT * FROM tasks'); return result; } }
(可选)使用同步API(不推荐)
如果非要使用同步操作,可改用openDatabaseSync,对应的同步transaction方法仍可用,但可能阻塞UI:
const db = SQLite.openDatabaseSync('tasks.db'); db.transaction((tx) => { tx.executeSql('INSERT INTO tasks (title) VALUES (?)', ['同步添加的任务']); });
内容的提问来源于stack exchange,提问作者Leah Eyestone
相关产品推荐
相关产品推荐

