Уважаемые коллеги-разработчики Android!
РЕДАКТИРОВАТЬ:
Спасибо всем за ваши ответы.По многим из них я вижу, что обычной (и принятой) практикой является написание собственного метода close()
в адаптере базы данных.Справедливо.
Но как это работает с ContentProvider
?Обычно при запросе к моей базе данных через мой ContentProvider
я просто выдаю что-то вроде:
Cursor managedCursor = managedQuery(...);
Я не понимаю, как я, с помощью этой методологии, могу получить доступ к пользовательскому методу close()
в моем пользовательском ContentProvider
реализация.Должен ли я вместо этого из моего Activity
сделать что-то вроде:
MyCustomProvider myProvider = (MyCustomProvider) getContentResolver();
, а затем:
myProvider.query(...);
myProvider.close();
И прежде всего;это вообще необходимо (по пункту 2 ниже)?
END EDIT В определенной степени я должен сказать, что я понимаю концепцию SQLiteOpenHelper
, что это такое, как оно используется и так далее.Я даже использую его регулярно, когда пишу свои ContentProvider
.
Дело в том, что я не уверен, что делать с объектом SQLiteDatabase
, возвращаемым myOpenHelper.getWritableDatabase()
(или функцию myOpenHelper.getReadableDatabase()
в зависимости от того, что имеет значение), когда я закончу с ней.
Согласно документации Android ContentProvider.onCreate()
:
Вы должны отложить нетривиальную инициализацию (например,открытие, обновление и сканирование баз данных) до использования поставщика контента (через query(Uri, String[], String, String[], String)
, insert(Uri, ContentValues)
и т. д.).
[...]
Если вы используете SQLiteOpenHelper
, избегайте вызова getReadableDatabase()
или getWritableDatabase()
из этого метода.(Вместо этого переопределите onOpen(SQLiteDatabase)
для инициализации базы данных при ее первом открытии.)
Вышеприведенное дает мне подсказку, где инициализировать базу данных (функции query(...)
, insert(...)
и т. Д.), но он ничего не говорит мне о том, как обрабатывать созданный объект SQLiteDatbase
, когда я закончу его использовать.
Должен ли я сохранить его как членпеременная моей ContentProvider
реализации (и относиться к ней как к "частному синглтону" для будущего использования)?
Должен ли я просто оставить его при выходе из *Функции 1069 *, insert(...)
и т. Д. И вы уверены, что SQLiteOpenHelper
справится со мной в будущих звонках?
[Вставьте свой альтернативный пункт-of-view здесь]
Будучи доверенным (или ленивым) разработчиком, я реализовал свой код в соответствии со вторым вариантом выше.Но я не могу избавиться от жуткого ощущения, что пренебрегаю чем-то важным.