为什么 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
而不是手动删除文件。
理论上,这应该在openDatabase
和deleteDatabase
中处理。
你能确认你确实在使用 deleteDatabase
吗?如果是,同时您的解决方法是安全的,并且在 sqflite 上报告问题以进行调查会很好。谢谢!
我有一个应用程序检查应用程序存储目录中的 sqflite db 文件,如果它存在,则删除该文件并创建一个新文件,然后在应用程序生命周期的剩余时间内打开它。我注意到热重启失败并出现 sql 异常,因为它仍然认为数据库在内存中的某处是打开的,即使我的所有引用都因重启而消失。这似乎是一个错误,因为我无法控制该数据库的关闭,除非我尝试确保它在应用程序被终止时关闭。这是设计使然吗?有没有标准的方法来处理它?
我注意到这个相关
经过进一步测试,处理此问题的一种方法似乎是检查文件是否存在。如果该文件存在,请继续并使用 sqflite 的 openDatabase 方法打开它。然后立即关闭它。然后使用io文件删除方法删除文件。然后您可以使用 openDatabase 方法创建一个新的数据库文件。这个解决方案可能比我希望的要贵一点,但它确实有效。
你的假设和调查是正确的。用不好的话来说,热重启期间发生的事情是 dart 环境在本地世界仍然 运行 时重新启动,对于 sqlite 这意味着打开的数据库保持打开状态,没有简单的方法可以从 dart 端知道这一点。
sqflite 中的热重启 hack 主要用于处理热重启,即使您处于 sqlite 事务中也是如此。如果没有这个 hack,它应该会发生您在场景中描述的情况。也就是说应该使用 deleteDatabase
而不是手动删除文件。
理论上,这应该在openDatabase
和deleteDatabase
中处理。
你能确认你确实在使用 deleteDatabase
吗?如果是,同时您的解决方法是安全的,并且在 sqflite 上报告问题以进行调查会很好。谢谢!