如何在Android中找到我的sqlite泄漏的位置

如何在Android中找到我的sqlite泄漏的位置,android,sqlite,android-debug,Android,Sqlite,Android Debug,当我运行应用程序并执行一些操作时 数据库“/data/user/0/project/database.db”的SQLiteConnection对象泄漏!请修复应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库 如何调试此每当您执行getWritableDatabase或getReadableDatabase时,您必须在处理完成后通过以下方式关闭数据库连接- getWritableDatabase().close(); 检查您是否有一些未提交的事务 一旦开始,您应该始终关闭事务。 确保先

当我运行应用程序并执行一些操作时

数据库“/data/user/0/project/database.db”的SQLiteConnection对象泄漏!请修复应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库

如何调试此

每当您执行getWritableDatabase或getReadableDatabase时,您必须在处理完成后通过以下方式关闭数据库连接-

getWritableDatabase().close();
检查您是否有一些未提交的事务 一旦开始,您应该始终关闭事务。
确保先关闭光标,然后关闭数据库

自从GINGERBREAD之后,ANDROID为开发者引入了检测可关闭泄漏对象的功能

private static final boolean DEVELOPER_MODE = true;

if (DEVELOPER_MODE) {
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .detectLeakedClosableObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());
    }
在要检测泄漏的可关闭对象的活动中使用此代码块

我希望这能帮助你……

Kotlin


在使用db的地方发布代码。
var db: SQLiteDatabase? = null
var cursor: Cursor? = null
try {

   db = getReadWriteDB()
   val query = "Select * From Table"
   cursor = db.rawQuery(query, null)

 } catch (e: Exception) {    
   e.printStackTrace()    
 } finally {    
//     First close the cursor
   if (cursor != null && !cursor.isClosed()) {    
      cursor.close()    
   }
//     second close the database

   if (db != null && db.isOpen) {
       db.close()
//     Release the database reference
       db.releaseReference()
   }
}