如何在React Native中使用SQLite?集成时无报错但无数据显示问题
React Native SQLite 预存数据库无法读取数据的排查与解决
我之前用react-native-sqlite-storage开发时也踩过一模一样的坑,你现在的情况大概率是几个关键配置没到位,给你一步步梳理解决思路:
1. 补上最关键的数据库复制配置
React Native不会自动把assets里的数据库复制到应用私有存储目录,你必须在openDatabase时明确指定复制来源。你的代码里应该缺了这个参数,修改后配置如下:
let db = SQLite.openDatabase({ name: 'test.db', createFromLocation: 1, // 1代表从assets目录复制同名数据库,对应你放的assets/test.db location: 'default', // 指定存储到默认私有目录,Android下无需额外权限 }, () => { console.log('数据库打开成功!'); }, (error) => { console.error('数据库打开失败:', error); // 一定要加错误回调,才能看到潜在问题 });
注意:Android系统区分文件名大小写,确保assets里的文件名是test.db,别写成Test.db或者其他变体。
2. 先确认数据库本身没问题
别着急写代码,用SQLite可视化工具(比如DB Browser for SQLite)打开你放在assets里的test.db,检查:
- 里面确实有你需要的表和数据
- 表名、字段名没有拼写错误(后续查询要完全对应)
3. 完善数据查询与状态更新逻辑
你的代码只初始化了sqliteData状态,但没有执行查询操作,也没把结果更新到state里。建议在组件挂载时执行查询:
componentDidMount() { this.fetchDatabaseData(); } fetchDatabaseData = () => { const db = SQLite.openDatabase({ name: 'test.db', createFromLocation: 1, location: 'default' }); db.transaction((tx) => { // 替换成你实际的表名 tx.executeSql( 'SELECT * FROM your_target_table', [], (tx, results) => { const rows = results.rows; let fetchedData = []; for (let i = 0; i < rows.length; i++) { fetchedData.push(rows.item(i)); } this.setState({ sqliteData: fetchedData }); console.log('查询到的数据:', fetchedData); // 打印确认是否拿到数据 }, (error) => { console.error('查询出错:', error); // 捕获查询阶段的错误 } ); }); };
4. 检查assets目录的正确性
确认Android项目的assets目录配置无误:
- 路径必须是
android/app/src/main/assets,没有的话手动创建 - 可以解压生成的APK,查看assets目录里是否包含
test.db,确认文件被正确打包
最后排查:权限问题
如果是Android 6.0以上版本,用location:'default'存储到私有目录不需要额外权限,但如果自定义了存储位置,需要在AndroidManifest.xml添加读写权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
按上面的步骤调整后,应该就能正常读取数据了。如果还是没效果,一定要看控制台的错误日志——我之前就是因为没加错误回调,误以为没报错,其实数据库打开阶段就失败了。
内容的提问来源于stack exchange,提问作者Sras
相关产品推荐
相关产品推荐

