2012-02-03 2 views
6
SQLiteOpenHelper dbOpenHelper = new (ctx, nameofdb); 
SQLiteDatabase db = dbOpener.getWritableDatabase(); 

Должен ли я позвонить .close() на обоих из них, или только один из них достаточно? Если да, то какой?Должен ли я называть .close() на обоих SQLiteDatabase и SQLiteOpenHelper

SQLiteDatabase 
SQLiteOpenHelper 

Проблема, которую я имею что я не вижу одну конкретную строку в представлении DDMS в Eclipse, но когда я использую курсор, чтобы получить его, это показывает, что у меня есть этот вход. Поэтому я думаю, что это может быть вызвано неправильным закрытием базы данных? Любой, кто может помочь, будет замечательным. Благодаря!

ответ

5

Если посмотреть на документы для SQLiteOpenHelper.close() ...

общественного синхронизированный недействительным близко()

Закрыть любой открытый объект базы данных.

Он не закрывает SQLiteOpenHelper, он закрывает базу данных.

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

Например, если у вас есть запрос, который вы используете регулярно, чтобы получить курсор для того, чтобы адаптер заполнил представление, создайте метод в своем классе SQLiteOpenHelper и поместите в него запрос.

Другими словами, не получайте ссылку на фактическую базу данных в своем основном коде, просто получите SQLiteOpenHelper, чтобы сделать все для вас.

+1

Что такое [принцип единой ответственности] (http://en.wikipedia.org/wiki/Single_responsibility_principle)? Я думал, что класс 'SQLiteOpenHelper' использует только [для помощи] для открытия (для создания \ обновления) базы данных. –

+0

@LeonidSemyonov: Можно утверждать, что, просто расширяя любой класс и добавляя функциональность (новые методы или интерфейсы реализации), все равно добавляет дополнительные обязанности ... но выполнение этого является основополагающим принципом OOD/OOP. В Android нередко создается универсальный класс «помощник» DB, который сам поддерживает 'SQLiteOpenHelper'. Моя точка зрения в некоторых случаях: «SQLiteOpenHelper» может быть расширен, чтобы обеспечить * ALL * методов «помощника» БД, а не иметь отдельную «вспомогательную» POJO базы данных. – Squonk

+0

@Squonk закрывает любой открытый объект базы данных, подразумевает, что он закрывает все экземпляры SqliteDatabase, открытые в приложении (при условии, что их несколько), или закрывает только те, которые привязаны к текущему объекту SqliteOpenHelper? – aandis

Смежные вопросы