Что делать с базой данных, извлеченной реализацией SQLiteOpenHelper, когда она будет завершена? - PullRequest
1 голос
/ 11 марта 2011

Уважаемые коллеги-разработчики 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, когда я закончу его использовать.

  1. Должен ли я сохранить его как членпеременная моей ContentProvider реализации (и относиться к ней как к "частному синглтону" для будущего использования)?

  2. Должен ли я просто оставить его при выходе из *Функции 1069 *, insert(...) и т. Д. И вы уверены, что SQLiteOpenHelper справится со мной в будущих звонках?

  3. [Вставьте свой альтернативный пункт-of-view здесь]

Будучи доверенным (или ленивым) разработчиком, я реализовал свой код в соответствии со вторым вариантом выше.Но я не могу избавиться от жуткого ощущения, что пренебрегаю чем-то важным.

Ответы [ 3 ]

0 голосов
/ 11 марта 2011

Если вы проверите пример использования этого объекта в API Android, вы увидите, что объект только что использовался, но закрытие не требуется.

Они реализуют метод close (), но я не видел, чтобы они его использовали.

0 голосов
/ 11 марта 2011

Это зависит от того, что вы делаете со своей базой данных. Если вы просто вставляете, удаляете или выбираете место возврата бизнес-объекта, вы можете закрыть базу данных сразу после ее использования. Насколько я знаю, он разработан так, что вы просто закрываете его и запрашиваете новый, когда вам это нужно.

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

0 голосов
/ 11 марта 2011

Полагаю, вам следует закрыть его, например, в onDestroy () действия, которое его использует.

Итак, в моем классе DBAdapter у меня есть:

/**
 * Close the database
 */
 public void close() {
     mDb.close();   //mDb was obtained using mDbHelper.getWritableDatabase();
 }

И в моемактивность:

 public void onCreate(Bundle bundle){
     ...
     mDBAdapter = new DBAdapter(this);
    // Open or create the database
    mDBAdapter.open();
 }    

@Override
public void onDestroy() {
    // Close the database
    mDBAdapter.close();
    super.onDestroy();        
}

Не уверен, подходит ли это для вашей концепции провайдера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...