Cordova Android SQLite插件默认存储位置无法更改求助
解决Cordova Android SQLite插件自定义存储位置的问题
我之前在开发Cordova Android应用时也碰到过一模一样的问题,直接用cordova.file.*路径给location参数根本不管用,后来查了插件文档和踩了几个坑才搞定,给你分享下可行的解决方案:
核心问题:location参数不是用来传自定义路径的
SQLite插件的location参数是预定义的存储区域标识符(比如"default"、"Internal"、"External"),不是直接传入文件路径的。如果要指定自定义存储位置,必须用fullPath参数来传递完整的数据库文件路径。
具体解决步骤
1. 确保插件版本正确
先确认你安装的是最新版的cordova-sqlite-storage和cordova-plugin-file插件,旧版本可能不支持自定义路径功能:
cordova plugin add cordova-sqlite-storage@latest cordova plugin add cordova-plugin-file@latest
2. 配置Android权限和兼容设置
针对Android 6.0+的动态权限和Android 10+的Scoped Storage限制,需要做以下配置:
- 在
config.xml的Android平台配置中添加:
<platform name="android"> <!-- 申请存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 兼容Android 10+的Scoped Storage --> <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application"> <application android:requestLegacyExternalStorage="true" /> </edit-config> </platform>
3. 动态申请存储权限(Android 6+)
Android 6及以上需要动态申请存储权限,否则无法访问外部存储目录,我们可以用cordova-plugin-android-permissions插件来处理:
cordova plugin add cordova-plugin-android-permissions
然后在代码中添加权限检查逻辑:
function checkStoragePermission(callback) { const permissions = cordova.plugins.permissions; permissions.checkPermission(permissions.WRITE_EXTERNAL_STORAGE, function(status) { if (status.hasPermission) { callback(); } else { permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, function() { callback(); }, function(err) { console.error("存储权限申请失败:", err); }); } }, function(err) { console.error("存储权限检查失败:", err); }); }
4. 使用fullPath指定自定义存储路径
先通过File插件创建目标目录(避免目录不存在导致数据库创建失败),然后拼接完整的数据库路径,用fullPath参数打开数据库:
document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { checkStoragePermission(function() { // 选择你想要的存储目录,这里用外部根目录下的自定义文件夹 window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, function(rootDir) { // 创建自定义目录(如果不存在) rootDir.getDirectory("MyAppDBs", {create: true, exclusive: false}, function(dbDir) { // 拼接完整的数据库文件路径 const fullDbPath = dbDir.toURL() + "test.db"; // 用fullPath参数打开数据库 window.sqlitePlugin.openDatabase({ name: "test.db", fullPath: fullDbPath, androidDatabaseProvider: "system" // 可选,部分设备需要这个参数确保兼容性 }, function(db) { console.log("数据库成功创建在自定义路径:", fullDbPath); // 后续正常执行数据库操作 db.transaction(function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS demo (id INTEGER PRIMARY KEY, content TEXT)'); }); }, function(err) { console.error("打开数据库失败:", err); }); }, function(err) { console.error("创建数据库目录失败:", err); }); }, function(err) { console.error("访问根目录失败:", err); }); }); }
验证存储位置
你可以在Android设备的文件管理器中找到对应的路径(比如/sdcard/MyAppDBs/test.db),卸载应用后这个文件不会被删除,符合你的需求。
内容的提问来源于stack exchange,提问作者Rameshwar Patnaik
相关产品推荐
相关产品推荐

