如果应用程序由于其他未处理的异常而崩溃,SQLDatabases 会关闭吗?

Do SQLDatabases get closed if an App crashes due to other unhanded Exceptions?

阅读数据库 SQL 最佳实践后,我将两个 try catch 提取到两个单独的方法中。我唯一能想到的会导致数据库泄漏的事情是在执行 getReadableDatabase() 之后是否存在外部未处理的异常。所以我的问题是,如果应用程序崩溃并重新启动,应用程序会自行清理吗?例如帮我关闭这个数据库会话?如您所见,我不太了解应用程序崩溃/重新启动后会发生什么。

  try {
            SQLiteDatabase database = helper.getReadableDatabase();
            doALongDatabaseTask(database);
            database.close();
        } catch (SQLException e){
            Log.w(Util.TAG, "getButtonPairsForSending db cannot be opened " + e);
        }

public void doALongDatabaseTask(SQLiteDatabase database){
 try
 {
   // Do long database query task
   } catch(Exception e) {

    }

}

在您的示例方法 doALongDatabaseTask(SQLiteDatabase database) 中处理了异常,只是什么也没做,所以在这种情况下您的数据库将调用 close()

但是,如果您的方法被定义为抛出异常

public void doALongDatabaseTask(SQLiteDatabase database) throws Exception{...}

那么您对 ​​close 的调用将被跳过,因为它进入了给定示例的第一部分中的 catch 块。

如果您使用的是足够高的 sdk 版本:如果您查看 SQLiteDatabase 的文档,您可以看到它实现了接口 AutoCloseable。 这意味着您可以尝试使用如下所示的资源

try(SQLiteDatabase database = helper.getReadableDatabase()){
    doALongDatabaseTask(database);
} catch (Exception e) {
    e.printstacktrace();
}

这等同于在 finally 块中调用 database.close()(无论如何你都应该这样做)但可读性更高。在大多数情况下,这应该会在您的应用程序崩溃时清理连接,并且在重新启动时可以获得新的连接。