【问题标题】:Why is sqflite retaining open database reference on hot reload为什么 sqflite 在热重载时保留开放数据库引用
【发布时间】:2020-11-14 05:59:15
【问题描述】:

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

我注意到这个相关的post

【问题讨论】:

    标签: flutter android-emulator sqflite


    【解决方案1】:

    您的假设和调查是正确的。用坏话来说,在热重启期间发生的情况是,dart 环境在原生世界仍在运行时重新启动,对于 sqlite,这意味着打开的数据库仍然处于打开状态,而从 dart 方面很难知道这一点。

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

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

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

    【讨论】:

    • 我没有使用 deleteDatabase。我一直在使用 io 包 File 类删除文件。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 2012-05-18
      • 1970-01-01
      • 2019-04-07
      • 2018-08-26
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多