1***@163.com
1***@163.com
  • 发布:2026-06-01 16:08
  • 更新:2026-06-01 16:09
  • 阅读:19

ios 使用不了数据库

分类:uni-app

1.初始化数据库提示成功
plus.sqlite.openDatabase({
name:'pinyin.db',
path:'/static/sql/pinyin.db',
success:()=>{
console.log('成功')
},
fail(err) {
console.log('失败',err)
}
});
2.检查数据库也是成功
let a= plus.sqlite.isOpenDatabase({
name:'pinyin.db',
path:'_doc/pinyin.db',
})
console.log('检查数据库是否打开',a)
3.查询数据库中的数据
plus.sqlite.selectSql({
name: 'pinyin.db', // 必须和 openDatabase 的 name 一致
sql: "SELECT chars FROM dag_char WHERE yin_jie_key = 'ni' LIMIT 50",
success: function(data) {
// const list = JSON.parse(data)
console.log('查询结果', data)
console.log('查询结果数量', data.length)
},
fail: function(e) {
console.log('查询失败', e)
}
})
提示{
"code": -1404,
"message": "Error:unable to open database file,https://ask.dcloud.net.cn/article/282"
}

2026-06-01 16:08 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

根据你提供的错误信息和代码,问题非常明确:数据库路径不一致

你在初始化时使用的路径是:

path: '/static/sql/pinyin.db'

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

但在检查数据库是否打开时使用的路径却是:

path: '_doc/pinyin.db'

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

而在执行查询时,name 参数虽然一致(都是 'pinyin.db'),但 iOS 系统会根据 openDatabase 时实际指定的 path 来定位文件。由于初始化时指定的是 /static/sql/pinyin.db,这个路径指向的是应用包内的静态资源目录,在 iOS 上这个目录是只读的,这就是导致错误 -1404(unable to open database file)的根本原因。

解决方案:

  1. 统一使用应用文档目录(_doc):如果需要读写数据库,必须将数据库文件放到可读写的应用文档目录下。
  2. 首次使用时复制数据库文件:如果数据库文件是预置在项目中的,首次打开应用时需要先将其从静态资源目录复制到 _doc 目录,然后再打开。

修改后的代码示例如下:

// 1. 先检查 _doc 目录下是否已有数据库文件  
plus.io.resolveLocalFileSystemURL('_doc/pinyin.db', (entry) => {  
    // 文件已存在,直接打开  
    openDatabase('_doc/pinyin.db');  
}, () => {  
    // 文件不存在,从静态资源目录复制  
    plus.io.resolveLocalFileSystemURL('_www/static/sql/pinyin.db', (entry) => {  
        entry.copyTo(plus.io.convertLocalFileSystemURL('_doc/'), 'pinyin.db', () => {  
            console.log('数据库文件复制成功');  
            openDatabase('_doc/pinyin.db');  
        }, (err) => {  
            console.log('复制失败', err);  
        });  
    }, (err) => {  
        console.log('静态资源文件不存在', err);  
    });  
});  

function openDatabase(dbPath) {  
    plus.sqlite.openDatabase({  
        name: 'pinyin.db',  
        path: dbPath,  
        success: () => {  
            console.log('数据库打开成功');  
            // 在这里执行查询  
            queryData();  
        },  
        fail(err) {  
            console.log('打开失败', err);  
        }  
    });  
}  

function queryData() {  
    plus.sqlite.selectSql({  
        name: 'pinyin.db',  
        sql: "SELECT chars FROM dag_char WHERE yin_jie_key = 'ni' LIMIT 50",  
        success: function(data) {  
            console.log('查询结果', data);  
        },  
        fail: function(e) {  
            console.log('查询失败', e);  
        }  
    });  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

关键点说明:

  • iOS 上静态资源目录 static 在运行时对应 _www 路径,且为只读。
  • _doc 是应用文档目录,可自由读写。
  • 所有数据库操作(打开、检查、查询)中的 path 必须保持一致。
  • 如果数据库文件较大(如你提到的 122M),请确保在复制时有足够的等待时间。

如果问题依然存在,可以检查数据库文件是否完整复制(对比文件大小),或者尝试使用 plus.io API 先确认文件是否存在。

内容为 AI 生成,仅供参考

要回复问题请先登录注册