- 打开App
- 打开数据库
- 用select语句随便查询一条数据,可以查询成功
- 用insert语句随便插入一条数据,可以插入成功
- 随便改一点uniapp的代码,等待代码热更新到手机并等待App重启
- 重启成功后打开数据库
- 用select语句随便查询一条数据,可以查询成功
- 用insert语句随便插入一条数据,插入报错,错误内容Attempt to write a readonly database
- 发布:2021-12-20 19:50
- 更新:2025-01-12 12:43
- 阅读:2406
产品分类: uniapp/App
PC开发环境操作系统: Mac
PC开发环境操作系统版本号: 11.6
HBuilderX类型: 正式
HBuilderX版本号: 3.2.16
手机系统: iOS
手机系统版本号: iOS 13.2
手机厂商: 苹果
手机机型: iPhone 6S
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
在代码热刷新后可以正常的insert或者update
在代码热刷新后可以正常的insert或者update
实际结果:
在代码热刷新后在insert或者update时提示Attempt to write a readonly database,但db文件是创建在_doc目录下的。
在代码热刷新后在insert或者update时提示Attempt to write a readonly database,但db文件是创建在_doc目录下的。
bug描述:
在开发过程中经过热刷新代码后,update与insert的操作就会一直提示Attempt to write a readonly database. Cannot create file private directory,在后台彻底关闭App并再重新打开后就可以update与insert的操作。但不管有没有经过热刷新,打开数据与查询等操作都是可以的。
数据库是创建在_doc目录下
plus.sqlite.openDatabase({
name: _this.dbName, //数据库名称
path: _doc/${_this.dbName}.db
, //数据库地址
success(e) { 数据库开启后的相关操作 },
fail(e) {}
})
insert操作:
plus.sqlite.executeSql({
name: _this.dbName,
sql: sqlStr,
success(e) {},
fail(e) {}
})
g***@tocs.cn (作者) - shonve
临时解决方案: 每次open db后测试一下insert一条数据,如果报错则先close db,然后open db就没有问题了。这是bug还是我的姿势不对?
热更新之前的数据库会关闭,重新open就可以了
-
g***@tocs.cn (作者)
每次App打开的时候都会主动去打开数据库的,如果没有开启就会开启再进行接下来的操作。关键是打开后可以查询,但是update和insert就会有问题。从目前的测试来看,热更新之前数据库并没有被关闭,在热更新之后去检查状态是开启的,这种情况下可以查询,但不能update和insert。
2021-12-21 22:35
-
回复 g***@tocs.cn: 现在有好的处理方法没?我也遇到了相同的问题,之前版本的HBuildx是没有问题的 更新了版本后就有这个问题了,小改点东西 程序必须重启才能不报错。
2021-12-27 15:15
-
回复 DCloud_iOS_WZT: ios上调试的时候 delete的时候也是报错:code":-1404,"message":"Error:Attempt to write a readonly database. Cannot create file private directory,such as:'www'.检查了数据库状态 是打开的。重新打开的时候 报错1401 提示 数据库已打开。
2022-05-23 20:15
随风l - 爱弟前端
使用发现 错误:{"code":-1404,"message":"android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (Sqlite code 8 SQLITE_READONLY), (OS error - 2:No such file or directory)
下面是写法:
plus.sqlite.executeSql({
name: 'main',
sql: INSERT INTO bs_xuewei VALUES (2989, 0, '0', '其他', '', 0, 1, '无学位', 1, 1, 0, 0);
,
success(res) {
console.log('成功:'+ res)
},
fail(err) {
console.log('错误:'+ JSON.stringify(err))
}
})
văn minh là sự tiến bộ về vật chấy và tinh thần của xã hội loài người là sự phát triển cao của văn hoá khi xã hội vượt qua thời kì dã man
这个问题解决了吗?我现在也遇到了这个问题,select可以,但是insert不行,提示数据据只读
module.exports = {
dbName: 'tools', // 数据库名称
dbPath: 'static/db/tools.db', // 数据库地址,推荐以下划线为开头 _doc/xxx.db
//创建数据库 或 有该数据库就打开
openSqlite() {
return new Promise((resolve, reject) => {
// 打开数据库
plus.sqlite.openDatabase({
name: this.dbName,
path: this.dbPath,
success(e) {
resolve(e);
},
fail(e) {
reject(e);
}
})
})
},
}