React Native Expo使用expo-sqlite报错:SQLite.openDatabase未定义
解决Expo SQLite
openDatabase 未定义及数据持久化问题 一、修正expo-sqlite的导入与初始化方式
最新版expo-sqlite已不再默认导出SQLite对象,旧文档的用法已失效,需采用模块化导入及正确的数据库初始化方式:
- 正确导入:
import * as SQLite from 'expo-sqlite';
- 持久化打开数据库:
要避免关闭应用后数据重置,需指定明确的数据库文件名,确保数据存储在持久化目录中:
// 打开名为"app_db.db"的持久化数据库 const db = SQLite.openDatabase('app_db.db');
二、完整可运行示例代码
import React, { useEffect } from 'react'; import { View, Text, StyleSheet } from 'react-native'; import * as SQLite from 'expo-sqlite'; // 初始化持久化数据库 const db = SQLite.openDatabase('app_db.db'); export default function App() { useEffect(() => { // 创建表(不存在则创建) db.transaction(tx => { tx.executeSql( 'CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT);', [], () => console.log('表创建成功'), (_, err) => console.log('建表失败:', err) ); // 插入测试数据(可重复执行,不会重复插入相同内容) tx.executeSql( 'INSERT OR IGNORE INTO notes (content) VALUES (?);', ['测试持久化数据'], (_, res) => res.insertId && console.log('数据插入成功,ID:', res.insertId), (_, err) => console.log('插入失败:', err) ); // 查询数据,验证持久化效果 tx.executeSql( 'SELECT * FROM notes;', [], (_, res) => { const data = res.rows._array; console.log('当前存储的数据:', data); }, (_, err) => console.log('查询失败:', err) ); }); }, []); return ( <View style={styles.container}> <Text>SQLite 持久化测试</Text> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', }, });
三、关键注意事项
- 弃用
expo-sqlite/legacy:该版本使用临时存储,关闭应用后数据会被自动清除,这是你之前遇到数据重置的核心原因。 - 检查版本兼容性:运行
npx expo install --check确认expo-sqlite与当前Expo SDK版本匹配,避免因版本不兼容导致的异常。 - 安卓模拟器权限:Expo会自动处理SQLite的存储权限,无需手动申请,确保模拟器未限制应用存储访问。
内容的提问来源于stack exchange,提问作者user27793975
相关产品推荐
相关产品推荐

