uni-app sqlite在alter表新加字段后首次select查询必报row too big
uni-app sqlite在alter表新加字段后首次select查询必报row too big
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | win11 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win11
HBuilderX类型:正式
HBuilderX版本号:3.98
手机系统:Android
手机系统版本号:Android 12
手机厂商:华为
手机机型:DBY-W09
页面类型:vue
vue版本:vue2
打包方式:云端
操作步骤:
plus.sqlite.executeSql({
name: 'pop',
sql: `ALTER TABLE ${table} ADD COLUMN ${field} INTERER`,
})
plus.sqlite.selectSql({
name: 'pop',
sql: `SELECT * FROM ${table}`,
})
预期结果:
返回正确数据
实际结果:
初次查询报错
{
"code": -1404,
"message": "android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1,http://ask.dcloud.net.cn/article/282"
}
bug描述:
sqlite在alter新加字段后首次select查询报错
{
"code": -1404,
"message": "android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1,http://ask.dcloud.net.cn/article/282"
}
只有第一次查询会报错, 跟数据太大无关 INTERER和TEXT都试过, 跟字段类型也无关
更多关于uni-app sqlite在alter表新加字段后首次select查询必报row too big的实战教程也可以访问 https://www.itying.com/category-93-b0.html
试了一下, alter完以后先关掉数据库再打开就正常了…
更多关于uni-app sqlite在alter表新加字段后首次select查询必报row too big的实战教程也可以访问 https://www.itying.com/category-93-b0.html
感谢反馈
多试了几次, 查询复杂语句才会报row too big, 而且并不是第二次就好了, 如果第二次也是复杂语句而且和第一次不一样的话也会报错
在使用 uni-app
开发时,如果你在 SQLite 数据库中通过 ALTER TABLE
语句为表添加了新字段,并且在首次执行 SELECT
查询时遇到 row too big
错误,这可能是由于 SQLite 的内部机制导致的。
问题原因
SQLite 在修改表结构时,并不会立即更新所有行的数据。当你使用 ALTER TABLE
添加新字段时,SQLite 会在表中添加新字段的定义,但并不会立即为每一行填充默认值。因此,在首次执行 SELECT
查询时,SQLite 可能会尝试读取这些未初始化的字段,导致 row too big
错误。
解决方案
为了避免这个问题,你可以在 ALTER TABLE
之后立即执行一个 UPDATE
语句,为新字段设置默认值。这样可以确保所有行都包含新字段的数据,从而避免首次查询时出现错误。
示例代码
假设你有一个表 my_table
,并且你添加了一个新字段 new_column
,你可以这样做:
-- 添加新字段
ALTER TABLE my_table ADD COLUMN new_column TEXT;
-- 为新字段设置默认值
UPDATE my_table SET new_column = 'default_value';