使用Cordova开发安卓应用如何读写Win10共享文件夹中的SQLite文件
实现方案说明
核心问题
你之前使用的cordova-plugin-file仅支持本地文件系统路径解析,不支持SMB协议的局域网共享路径访问;同时SQLite本身是基于本地文件块级读写的数据库,无法直接打开和操作远程网络路径下的数据库文件,所以直接替换路径的方案不可行。
适配插件选择
你需要额外安装支持SMB协议的Cordova插件来实现局域网共享文件夹的文件读写,推荐使用cordova-plugin-smbclient,该插件支持安卓端对接Windows SMB共享,可完成文件的上传、下载、目录遍历等操作。
逻辑调整思路
不能直接打开共享路径下的SQLite文件,需要按以下流程实现:
- 通过SMB插件连接Windows共享文件夹,将目标
shared.db下载到安卓本地缓存目录 - 用你现有的SQLite插件操作本地缓存的数据库文件,完成所有增删改查逻辑
- 所有数据库操作完成后,将修改后的本地数据库文件通过SMB插件上传覆盖共享文件夹中的原文件
注意:多设备同时操作共享数据库时会存在文件覆盖冲突风险,建议操作前先在共享目录创建.lock标记文件,操作完成后删除,避免并发写入损坏数据库。
调整后代码示例
document.addEventListener('deviceready', function() { const SMB_SERVER = '192.168.1.29'; const SMB_SHARE = 'shrd'; const SMB_USER = '你的Windows共享账号'; const SMB_PWD = '你的Windows共享密码'; const DB_NAME = 'shared.db'; // 本地缓存目录 const localCacheDir = 'file:///storage/emulated/0/Android/cache/'; // 1. 连接SMB共享 window.smbClient.connect(SMB_SERVER, SMB_USER, SMB_PWD, function() { // 2. 下载共享目录的db到本地缓存 window.smbClient.downloadFile(`smb://${SMB_SERVER}/${SMB_SHARE}/${DB_NAME}`, localCacheDir + DB_NAME, function() { // 3. 打开本地缓存的db操作 window.resolveLocalFileSystemURL(localCacheDir, function(cacheDirEntry) { var db = window.sqlitePlugin.openDatabase({ name: DB_NAME, androidDatabaseLocation: cacheDirEntry.toURL() }); db.transaction(function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS MyTable (data)'); tx.executeSql('INSERT INTO MyTable VALUES (?)', ['test-value']); }, function(error) { console.log('操作数据库错误: ' + error.message); }, function() { db.transaction(function(tx) { tx.executeSql('SELECT data from MyTable', [], function(tx_ignored, resultSet) { console.log('记录数: ' + resultSet.rows.length); for (var i=0; i < resultSet.rows.length; ++i) { console.log('索引: ' + i + ' 值: ' + resultSet.rows.item(i).data); } // 4. 操作完成后上传db回共享目录 window.smbClient.uploadFile(localCacheDir + DB_NAME, `smb://${SMB_SERVER}/${SMB_SHARE}/${DB_NAME}`, function() { console.log('数据库已同步到共享文件夹'); }, function(err) { console.log('上传失败: ' + err.message); }); }); }, function(error) { console.log('查询数据库错误: ' + error.message); }); }); }); }, function(err) { console.log('下载共享数据库失败: ' + err.message); }); }, function(err) { console.log('SMB连接失败: ' + err.message); }); });
额外注意事项
- 安卓端需要配置网络访问权限,安卓11及以上版本需要申请对应本地存储读写权限
- Windows端需要放开445端口防火墙规则,确保共享文件夹对配置的账号开放读写权限
- 如果共享目录允许匿名访问,SMB账号密码填空字符串即可
内容的提问来源于stack exchange,提问作者peterNolan
相关产品推荐
相关产品推荐

