数据库的 SQLiteConnection 对象被泄露!请修复您的应用程序
Posted
技术标签:
【中文标题】数据库的 SQLiteConnection 对象被泄露!请修复您的应用程序【英文标题】:A SQLiteConnection object for database was leaked! Please fix your application 【发布时间】:2014-10-08 02:15:35 【问题描述】:我的应用程序给了我这个警告
数据库的 SQLiteConnection 对象 '+data+data+com_example_test+database' 被泄露了!请修复 您的申请以正确结束正在进行的交易并关闭 不再需要的数据库。
但每次使用后我都会关闭 db 对象和光标。
try
while (cursor.moveToNext())
...
finally
if (cursor != null && !cursor.isClosed())
cursor.close();
...
db.close();
你能帮我理解问题所在吗? 谢谢!!!
更新! 我从这篇文章中尝试了这个解决方案 SQLite Connection leaked although everything closed
而且我没有内存泄漏了,这是一个好的解决方案吗?
【问题讨论】:
有些地方不会发生这种情况。 似乎问题出在写入数据库中,您有未提交的事务吗? SQLite Connection leaked although everything closed的可能重复 【参考方案1】:可能的解决方案:
你有not committed the transactions
你已经开始(你应该
一旦开始,请务必关闭交易)
检查是否关闭了已打开的游标
使用Sqlite
(看起来你已经从你发布的代码中完成了这一步)
还将db.close
移动到finally
块
在使用context.deleteDatabase(...)
删除数据库然后使用dbHelper.getWritableDatabase()
重新创建数据库之前,您尚未在数据库上调用db.close
【讨论】:
请您帮忙解决这个问题issue【参考方案2】:只需将 db.close
拖到 finally
块中即可。
【讨论】:
【参考方案3】://Inside your SQLite helper class
@Override
public synchronized void close ()
if (db != null)
db.close();
super.close();
//Inside the activity that makes a connection to the helper class
@Override
protected void onDestroy ()
super.onDestroy();
//call close() of the helper class
dbHelper.close();
【讨论】:
感谢您抽出宝贵时间留下答案。不幸的是,它缺少对您提供的内容的描述和解释。请更新您的问题以包含此【参考方案4】:在我的情况下,当您尝试下载新数据并且应该更新数据库时导致错误。
我通过调用SELECT 0
解决了实例化数据库的问题。这会导致数据库被更新,所以之后我尝试下载新数据。并且工作正常。
【讨论】:
【参考方案5】:此代码停止泄漏并修复光标问题。
public class DatabaseHelper extends SQLiteOpenHelper
private static DatabaseHelper sInstance;
private static final String DATABASE_NAME = "database_name";
private static final String DATABASE_TABLE = "table_name";
private static final int DATABASE_VERSION = 1;
public static DatabaseHelper getInstance(Context context)
// Use the application context, which will ensure that you
// don't accidentally leak an Activity's context.
if (sInstance == null)
sInstance = new DatabaseHelper(context.getApplicationContext());
return sInstance;
/**
* Constructor should be private to prevent direct instantiation.
* make call to static factory method "getInstance()" instead.
*/
private DatabaseHelper(Context context)
super(context, DATABASE_NAME, null, DATABASE_VERSION);
【讨论】:
【参考方案6】:可能你忘了去掉调试的断点 示例:
【讨论】:
以上是关于数据库的 SQLiteConnection 对象被泄露!请修复您的应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 sqlite-net orm 的 SQLiteConnection.Delete(object) 命令后更改 sqlite 文件大小
“SQLite.SQLiteConnection”的类型初始化器抛出异常
数据库内存泄漏——A SQLiteConnection object for database '/data/data/.../databases/....db' was leaked
网络共享路径上的 sqliteconnection(通用 Windows 平台)
Windows Mobile 6.1 + SQLite:无法加载类型“System.Data.SQLite.SQLiteConnection”
在 playstore (SQLiteConnection.java) 上启动后,我的 Flutter 应用程序在多个设备上崩溃