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

4 回复

试了一下, 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';
回到顶部