Intereting Posts
Есть ли способ создать TextView для прописных букв? Как поместить несколько размеров виджетов в один apk? Проблема с макетами: как разместить что-то сверху и снизу? Android масштабирование изображений до плотности экрана Просмотр андроидов: просмотр заголовков и нижних колонтитулов TextView.getSelectionEnd () возвращает значение начального индекса для устройств Samsung Marshmallow 6.0 Устанавливать значок запуска на главном экране один раз Где выходит LogCat Log.x () при запуске тестов Android JUnit? Активность Android по блокировке блокировки по умолчанию Добавление массива кнопок в GridView в приложении для Android Как оживить текст внутри кнопки Почему Android 4.0 / Ice Cream Sandwich выделяет столько кучи памяти? Glide assert: java.lang.IllegalArgumentException: вы должны вызвать этот метод в основном потоке DroidGap нельзя разрешить в виде Наложение панели инструментов поверх содержимого активности

Объект соединения SQLite просочился – Android

Я делаю свое первое приложение для Android, и сначала я взял несколько учебников по sqlite, которые научили меня использовать databaseHelper, который расширяет SQLiteOpenHelper. Поэтому мой DatabaseHelper расширяет SQLiteOpenHelper. Я получаю предупреждение об утечке соединения sqlite в Logcat, поэтому мне бы хотелось, чтобы некоторые советы о том, что делать, чтобы исправить это.

Я получаю эту ошибку:

02-01 21:39:50.740: W/SQLiteConnectionPool(32061): A SQLiteConnection object for database '/data/data/com.btf271.fashionassistant/databases/clothingManager' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed. 

Мои функции DatabaseHelper, вызываемые там, где происходит утечка:

  public List<Sticker> getObjectsByGenderAndCategory(String gender, String category) { List<Sticker> objects = new ArrayList<Object>(); String selectQuery = String.format( "SELECT * FROM %s WHERE %s = \"%s\" AND %s = \"%s\"", TABLE_OBJECT, KEY_GENDER, gender, KEY_CATEGORY, category); Log.e(LOG, selectQuery); SQLiteDatabase db = this.getReadableDatabase(); Cursor c = db.rawQuery(selectQuery, null); try{ // looping through all rows and adding to list if (c.moveToFirst()) { do { Object o = createClothingItemJavaObject(c); // adding to object list objects.add(o); } while (c.moveToNext()); } }finally { c.close(); db.close(); } return objects; } 

Я нашел это, что я попробую завтра. Уже поздно .

Благодарю.

Solutions Collecting From Web of "Объект соединения SQLite просочился – Android"

Все, что я сделал, это реализовать этот ответ на аналогичный вопрос, и теперь он не показывает ошибку утечки объекта соединения SQL. Я не могу рекомендовать это достаточно. Для реализации и работы потребовалось всего несколько минут.

Вот код:

 public class DatabaseHelper extends SQLiteOpenHelper { private static DatabaseHelper mInstance = null; 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 ctx) { // Use the application context, which will ensure that you // don't accidentally leak an Activity's context. // See this article for more information: http://bit.ly/6LRzfx if (mInstance == null) { mInstance = new DatabaseHelper(ctx.getApplicationContext()); } return mInstance; } /** * Constructor should be private to prevent direct instantiation. * make call to static factory method "getInstance()" instead. */ private DatabaseHelper(Context ctx) { super(ctx, DATABASE_NAME, null, DATABASE_VERSION); } } 

Я исправил это, добавив

 @Override protected void finalize() throws Throwable { this.close(); super.finalize(); } 

К расширенному классу SQLiteOpenHelper

Сопоставьте каждый вызов getReadableDatabase() и getWritableDatabase() с соответствующим close() в том же объекте базы данных.

Например, ваш getAllClothingItemsByGenderAndCategory() вызывает getReadableDatabase() но не close() его. Добавьте db.close() после c.close() .

Ваш closeDB() не имеет смысла, так как он получает новую ссылку на базу данных с помощью getReadableDatabase() и закрывает именно это . Он ничего не делает, чтобы закрыть существующее соединение с базой данных.

Каждый раз, когда вы открываете базу данных (читаемую или записываемую), а курсор, который использует ресурсы памяти, должен быть освобожден, используя «.close ();» После того, как его использование заканчивается в каждой функции базы данных .. вашей_данной object.close (); И курсор object.close ();