#android #sql
#Android #sql
Вопрос:
У меня есть БД, которую я использую во всех своих действиях. В БД есть только одна запись.
В первом действии он открывается или создается, а затем помещается в мой глобально используемый объект следующим образом
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// first get the current data from the DB
myDBAdapter = new MyDBAdapter(this);
GlobalVars.myDBAdapter = myDBAdapter; // we store the DBAdapter in our global var
myDBAdapter.open();
Cursor cursor = myDBAdapter.fetchMainEntry();
startManagingCursor(cursor);
// if there is no DB yet, lets just create one with default data
if (cursor.getCount() == 0) {
createData();
cursor = myDBAdapter.fetchMainEntry();
startManagingCursor(cursor);
}
Теперь в другом действии я получаю доступ к уже открытой базе данных следующим образом…
GlobalVars.myDBAdapter.updateMainEntry(1,.....);
Я не закрываю БД, когда оставляю одно действие, чтобы перейти к следующему. Только что получен доступ к БД (поскольку она была открыта при самом первом действии).
Только при выходе из приложения я сжимаю БД следующим образом…
@Override
protected void onDestroy() {
super.onPause();
myDBAdapter.close();
}
Причина, по которой я также спрашиваю об этом, заключается в том, что я получаю эту ошибку…
Завершение курсора android.database.sqlite.SQLiteCursor @48106730 в mainEntry, который не был деактивирован или закрыт
и кажется, что мое приложение выходит из строя на определенных устройствах, но я не могу найти причину этого во время отладки.
Это правильно и лучшая практика, или мне нужно закрывать базу данных при выходе из действия и открывать ее при входе в следующее действие при переключении между действиями?
Большое спасибо!
Ответ №1:
Самое лучшее (я протестировал это в нескольких моих приложениях) — это:
- объявить адаптер базы данных как переменную экземпляра действия:
private DBAdapter mDb;
- создайте его и откройте в activity onCreate():
mDb = новый адаптер базы данных (this); mDb.open();
- закройте его в activity onDestroy():
mDb.close(); mDb = null;
Работает как шарм. Примечание: класс приложения onTerminate «никогда не будет вызываться на рабочем устройстве Android» в соответствии с документами.
Комментарии:
1. да, это то, что я делаю, но вопрос в том, как другие действия получают доступ к этой БД. И почему я получаю СООБЩЕНИЕ об ОШИБКЕ: завершение курсора android.database.sqlite — хотя и только иногда?
2. Используйте in в каждом действии, в котором вам нужна ваша база данных. И не делайте: «super.onPause ();» в вашем onDestroy, просто «super.onDestroy ();». Важно правильно завершить каждое действие, когда оно должно быть завершено.
3. КАЖДОЕ действие должно иметь собственное подключение к базе данных и закрывать его при завершении действия. Это самый безопасный подход.
4. О вашем курсоре: объявите его как переменную экземпляра действия, и при закрытии действия выполните: if(mCursor !=null) mCursor.close();
5. Я получаю доступ к БД только через мой один объект myDBAdapter, и БД никогда не закрывается до завершения последнего действия приложения. Вы действительно предполагаете, что я должен закрывать / открывать БД при переключении между действиями? Почему мой myDBAdapter не может содержать базу данных и управлять доступом без закрытия / открытия?
Ответ №2:
Вы можете использовать sqlite в качестве базы данных для своего приложения. Затем вам нужно создать общий класс для всего вашего приложения, например «DBAdapter». Затем напишите коды для управления базой данных. После этого вам просто нужно создать объект DBAdapter в вашей деятельности. Таким образом, вы можете получить доступ к своей БД из любого действия вашего приложения. http://developer.android.com/guide/topics/data/data-storage.html#db Эта ссылка может быть полезной.
Комментарии:
1. спасибо — это то, что я сделал с MyDBAdapter. Объявлено так: общедоступный класс WebiDBAdapter ….
2. Извините, я пропустил часть вашего вопроса. Да, вы должны открывать и закрывать каждый объект cursor перед завершением действия. Также вы должны открывать и закрывать свою базу данных в каждом действии.
3. Но, как я уже писал, я могу получить доступ к своей базе данных в каждом действии без закрытия / открытия. И я всегда получаю доступ к своей БД только через один объект класса MyDBAdapter. ОШИБКА: завершение курсора android.database.sqlite. SQLiteCursor возникает только иногда (не знаю, когда) — и приложение вылетает на некоторых устройствах, которые купили мое приложение, — но я не уверен, что это из-за этого открытия / закрытия…
4. Откройте и закройте базу данных в каждом действии. Кроме того, закройте созданный вами объект cursor после его использования в activity. Надеюсь, это сработает для вас.