如果应用程序由于其他未处理的异常而崩溃,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()
(无论如何你都应该这样做)但可读性更高。在大多数情况下,这应该会在您的应用程序崩溃时清理连接,并且在重新启动时可以获得新的连接。
阅读数据库 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()
(无论如何你都应该这样做)但可读性更高。在大多数情况下,这应该会在您的应用程序崩溃时清理连接,并且在重新启动时可以获得新的连接。