数据库的SQLiteConnection对象泄露了!请修复您的申请

时间:2014-08-14 12:16:20

标签: java android database sqlite

我的申请会给我这个警告

  

数据库的SQLiteConnection对象   &#39 + +数据数据+ com_example_test +数据库'被泄露了!请修理   您的应用程序正确结束正在进行的事务并关闭   数据库不再需要时。

但是每次使用后我都会关闭db对象和光标。

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

...
    db.close();

你能帮我理解是什么问题吗? 感谢!!!

更新<!/强> 我从这篇文章中尝试这个解决方案 SQLite Connection leaked although everything closed

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

6 个答案:

答案 0 :(得分:26)

可能的解决方案

  • 你已经开始not committed the transactions(你应该 一旦你开始,总是关闭交易)
  • 检查您是否已关闭已打开的光标 使用Sqlite(看起来你已经从发布的代码中完成了这一步)
  • 同时将db.close移至finally阻止
  • 您尚未在数据库上调用db.close,然后使用context.deleteDatabase(...)将其删除,然后使用dbHelper.getWritableDatabase()重新创建

答案 1 :(得分:7)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在我的情况下,当y尝试下载新数据时会导致错误,并且应该更新数据库。

我通过调用else解决了它实例化数据库的问题。这导致数据库被更新,所以在那之后我尝试下载新数据。工作得很好。

答案 4 :(得分:0)

您可能忘记删除调试的断点 样品: enter image description here

答案 5 :(得分:-4)

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.main_menu, menu);

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);

    switch (item.getItemId()){
        case R.id.settings:
            Log.i("Menu item selected", "Settings");
            return true;
        case R.id.help:
            Log.i("Menu item selected", "Help");
            return  true;
        default:
            return false;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
}

这给了我数据库对象泄漏错误。 尽管该应用程序运行正常,并且还登录了“运行”标签,但是android监视器向我显示了该错误,但未记录信息。