Подтвердить что ты не робот

Произошел утечка объекта SQLiteConnection для базы данных! Пожалуйста, исправьте свою заявку

Мое приложение дает мне это предупреждение

Объект SQLiteConnection для базы данных '+ data + data + com_example_test + database' просочился! Пожалуйста исправьте ваше приложение успешно завершает транзакции и закрывает когда он больше не нужен.

Но я закрываю объект db и курсор после каждого использования.

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

...
    db.close();

Можете ли вы помочь мне понять, в чем проблема? спасибо!!!

UPDATE! Я пробую это решение из этой публикации SQLite Connection просочился, хотя все закрыто

и у меня больше нет утечки памяти, это хорошее решение?

4b9b3361

Ответ 1

Возможные решения:

  • Вы not committed the transactions вы начали (вы должны всегда закрывать транзакцию после того, как вы начали)
  • Проверьте, закрыли ли вы открытые курсоры, если вы используете Sqlite (похоже, вы сделали этот шаг из кода, который вы опубликовали)
  • Также переместите db.close чтобы finally заблокировать
  • Вы не вызывали db.close для базы данных, прежде чем удалить ее с помощью context.deleteDatabase(...) а затем воссоздали ее с помощью dbHelper.getWritableDatabase()

Ответ 2

Просто перетащите этот db.close в блок finally.

Ответ 3

В моем случае ошибка была вызвана, когда вы пытаетесь загрузить новые данные, и база данных должна быть обновлена.

Я решил создать экземпляр базы данных, вызвав SELECT 0. Это приводит к тому, что база данных обновляется, поэтому после этого я пытаюсь загрузить новые данные. И работал нормально.

Ответ 5

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

Ответ 6

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 показывает ошибку и не регистрирует информацию.