数据库的SQLiteConnection对象已泄漏!请修复您的应用程序

eni9jsuy  于 2022-11-15  发布在  SQLite
关注(0)|答案(7)|浏览(150)

我的应用程序给了我这样的警告
数据库‘+DATA+DATA+COM_EXAMPLE_TEST+DATABASE’的SQLiteConnection对象被泄漏!请修复您的应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库。
但每次使用后,我都会关闭db对象和游标。

try {
            while (cursor.moveToNext()) {
              ...
            }
        } finally {
            if (cursor != null && !cursor.isClosed())
                cursor.close();
        }

...
    db.close();

你能帮我了解一下问题出在哪里吗?谢谢!

**更新!**我尝试了这个解决方案,从这个帖子SQLite连接泄漏,尽管一切都关闭了

而且我不再有内存泄漏,这是一个好的解决方案吗?

2ledvvac

2ledvvac1#

可能的解决方案

  • 您已启动not committed the transactions(启动后应始终关闭交易)
  • 如果您使用的是Sqlite,请检查您是否已关闭已打开的游标(从您发布的代码看,您似乎已经完成了此步骤)
  • 还将db.close移动到finally
  • 在使用context.deleteDatabase(...)删除数据库并使用dbHelper.getWritableDatabase()重新创建它之前,您尚未在数据库上调用db.close
yx2lnoni

yx2lnoni2#

只需将db.close向上拖动到finally块中。

tsm1rwdh

tsm1rwdh3#

//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();
}
xqk2d5yq

xqk2d5yq4#

这段代码可以阻止泄漏并修复游标问题。

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);
      }
    }
ctrmrzij

ctrmrzij5#

在我的例子中,错误是在尝试下载新数据时导致的,并且数据库应该更新。
我通过调用SELECT 0解决了示例化数据库的问题。这会导致数据库更新,因此在那之后我会尝试下载新数据。而且工作得很好。

6psbrbz9

6psbrbz96#

可能您忘了去掉调试示例的断点

b0zn9rqh

b0zn9rqh7#

在我的例子中,我调用的是getWritableDatabase或getReadableDatabase,但根本不使用它。例如,如果您将其与“execSQL”一起使用,则execSQL将调用“relaseReference”“释放对对象的引用,如果最后一个引用被释放,则关闭该对象。”

相关问题