为什么 sqflite 在热重载时保留开放数据库引用

Why is sqflite retaining open database reference on hot reload

我有一个应用程序检查应用程序存储目录中的 sqflite db 文件,如果它存在,则删除该文件并创建一个新文件,然后在应用程序生命周期的剩余时间内打开它。我注意到热重启失败并出现 sql 异常,因为它仍然认为数据库在内存中的某处是打开的,即使我的所有引用都因重启而消失。这似乎是一个错误,因为我无法控制该数据库的关闭,除非我尝试确保它在应用程序被终止时关闭。这是设计使然吗?有没有标准的方法来处理它?

我注意到这个相关

经过进一步测试,处理此问题的一种方法似乎是检查文件是否存在。如果该文件存在,请继续并使用 sqflite 的 openDatabase 方法打开它。然后立即关闭它。然后使用io文件删除方法删除文件。然后您可以使用 openDatabase 方法创建一个新的数据库文件。这个解决方案可能比我希望的要贵一点,但它确实有效。

你的假设和调查是正确的。用不好的话来说,热重启期间发生的事情是 dart 环境在本地世界仍然 运行 时重新启动,对于 sqlite 这意味着打开的数据库保持打开状态,没有简单的方法可以从 dart 端知道这一点。

sqflite 中的热重启 hack 主要用于处理热重启,即使您处于 sqlite 事务中也是如此。如果没有这个 hack,它应该会发生您在场景中描述的情况。也就是说应该使用 deleteDatabase 而不是手动删除文件。

理论上,这应该在openDatabasedeleteDatabase中处理。

你能确认你确实在使用 deleteDatabase 吗?如果是,同时您的解决方法是安全的,并且在 sqflite 上报告问题以进行调查会很好。谢谢!