Произошел утечка объекта 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 просочился, хотя все закрыто
и у меня больше нет утечки памяти, это хорошее решение?
Ответы
Ответ 1
Возможные решения:
- Вы
not committed the transactions
вы начали (вы должны всегда закрывать транзакцию после того, как вы начали) - Проверьте, закрыли ли вы открытые курсоры, если вы используете
Sqlite
(похоже, вы сделали этот шаг из кода, который вы опубликовали) - Также переместите
db.close
чтобы finally
заблокировать - Вы не вызывали
db.close
для базы данных, прежде чем удалить ее с помощью context.deleteDatabase(...)
а затем воссоздали ее с помощью dbHelper.getWritableDatabase()
Ответ 2
Просто перетащите этот db.close
в блок finally
.
Ответ 3
В моем случае ошибка была вызвана, когда вы пытаетесь загрузить новые данные, и база данных должна быть обновлена.
Я решил создать экземпляр базы данных, вызвав SELECT 0
. Это приводит к тому, что база данных обновляется, поэтому после этого я пытаюсь загрузить новые данные. И работал нормально.
Ответ 4
Возможно, вы забыли удалить точку останова образца отладки: введите описание изображения здесь
Ответ 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 показывает ошибку и не регистрирует информацию.