我一直在寻找一个解决方案来创建我的slqite数据库,访问同步并避免打开/关闭连接的问题,我在这个good answer中失败了:
但是,在此解决方案中,没有明确关闭数据库。 许多人认为这不是问题,但我知道如何在应用程序停止后关闭连接。
注意:在上述链接中,答案的作者建议:
随着我的实施,单身人生活在生命中 应用。因此我没有实现一个显式的析构函数, 相反,在应用程序关闭代码(或崩溃处理程序)数据库是 明确关闭。请参见Thread.setDefaultUncaughtExceptionHandler() 在我发布我的样本后,我在ApplicationContext.onCreate()中使用了它 代码。
这可以是一个很好的解决方案吗?如果是,我该如何管理Thread.setDefaultUncaughtExceptionHandler()?
编辑:
我还想,如果数据库资源不可用,则需求线程将等待数据库释放。我可以使用这段代码吗?不推荐使用isDbLockedByOtherThreads()
private myDatabase(){
final DbHelper mDbHelper =new DbHelper(ApplicationFramework.getContext());
mDB = mDbHelper.getWritableDatabase();
while(mDB.isDbLockedByCurrentThread() || mDB.isDbLockedByOtherThreads()) {
//db is locked, keep looping
}
}
答案 0 :(得分:2)
在应用程序停止后,您无需担心关闭数据库连接,它会自动关闭。
实际上内部只有一个连接,你使不同的实例成为不同的东西。这就是为什么许多人说关闭数据库连接没有任何意义。
始终拥有一个数据库连接的静态对象,它将是安全的,不会出现异常,也不用担心关闭它。
如果您尝试同时从实际的不同连接写入数据库,则最终会失败。它不会等到第一个完成然后写。它根本不会写你的改变。更糟糕的是,如果您没有在SQLiteDatabase上调用正确版本的插入/更新,则不会出现异常。您只需在LogCat中收到一条消息即可。
回答更新的查询
仅使用数据库连接的单个静态实例,无需创建其他线程,所有操作都将自动同步。