当我试图修改我现有的SQLITE数据库时,我得到了一个openDatabase错误。
我修改了一个现有的表并创建了一个新的表。
但是,该错误在执行我的onUpgrade回调之前会出现。
执行openDatabase时出现错误
错误:
SqfliteDatabaseException (DatabaseException(无法执行此操作,因为没有当前事务)。sql 'COMMIT‘args []})
static Future<Database> initDatabase([int dbVersion]) async {
return await openDatabase(join(await getDatabasesPath(), _dbName),
version: 2, onUpgrade: _onUpgrade, onCreate: _onCreate);
}当我将openDatabase的参数"version“更改为1时,SQL错误不再出现。但是我不能进入onUpgrade回调。
谢谢
发布于 2021-02-16 14:31:04
新创建数据库时,使用数据库版本调用onCreate (此处2)。
数据库版本保存到数据库中,下一次打开数据库并存在时,将检查版本。如果数据库的版本是>=,则构造函数中给出的版本不调用onUpgrade (也不调用onCreate,因为数据库已经存在,无论哪个版本)。
如果在创建版本后将其设置为1,则不会调用onUpgrade,因为您的版本已经是2。
标准程序如下:
从数据库版本1开始,基本的创建脚本(以及预填充数据的脚本)在onCreate中执行。
每次必须更改数据库时(新表、新值、修改表等)将数据库版本增加1,并在onUpgrade上实现给定版本的更改脚本。
这里有一个关于如何调用这些方法的示例,假设该应用程序是在给定的版本2中发布的:
App是第一次安装和启动,数据库不存在: onCreate与版本2一起调用,您必须执行从初始到版本2的所有创建和更新脚本。
现在将数据库版本设置为3,下次应用程序启动时:调用旧版本2和新版本3的onUpgrade时,必须执行版本3的更新脚本。
我将创建每个版本要运行的脚本列表,并在onCreate (从1到给定版本)和onUpgrade (从oldVersion+1到newVersion )中迭代它。
发布于 2021-02-16 12:49:12
无论何时修改数据库表,都必须卸载应用程序,然后运行项目,因为当您第一次执行应用程序时,已经在本地db中创建了表,而当您修改代码时,它将您的查询与您首次创建的表匹配。
https://stackoverflow.com/questions/66213959
复制相似问题