React-Native使用react-native-sqlite-storage无法连接预置SQLite数据库
修复方案
- 修正
OpenDB函数异步逻辑错误:当前resolve()在调用openDatabase后立刻同步执行,未等待数据库打开成功回调,导致ReadDB执行时数据库未完成初始化触发报错,修改为在打开成功回调中执行resolve:
const OpenDB = () => { return new Promise((resolve, reject) => { global.db = SQLite.openDatabase( { name: 'mysqlite.db', createFromLocation: '~mysqlite.db', }, () => { console.log("Connection success!"); resolve(); // 数据库打开成功后再resolve }, error => { console.log(error); reject(error); }); // 移除原位置的resolve() }); }
- 检查资源打包配置,避免数据库文件被压缩或过滤:在
android/app/build.gradle中添加以下配置,禁止压缩.db格式的资源文件,部分默认打包配置会压缩asset下的二进制文件导致数据库无法被识别:
android { aaptOptions { noCompress 'db' } }
- 校验
createFromLocation参数和文件存放路径完全匹配:- 如果你把数据库文件放在
assets/www目录下,参数要写为createFromLocation: '~www/mysqlite.db' - 如果你把数据库文件放在
assets根目录下,参数才用createFromLocation: '~mysqlite.db'
- 如果你把数据库文件放在
- 验证数据库文件格式:你用DB Browser for SQLite导出的数据库必须是SQLite3标准格式,不要设置密码或加密,导出后可以先在PC端用工具打开确认文件没有损坏,再放到asset目录下。
- 调试验证文件是否打包进APK:编译生成APK后,用解压工具打开APK,查看
assets目录下是否存在对应路径的mysqlite.db文件,确认文件没有被打包流程过滤。 - 临时降级targetSdkVersion测试:Android 11的存储权限限制可能导致异常,你可以把
android/build.gradle中的targetSdkVersion临时降到29,卸载重装应用测试是否能正常打开。
内容的提问来源于stack exchange,提问作者Luiey
相关产品推荐
相关产品推荐

