2011-12-25 3 views
1

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

dbHelper = new DBHelper(this); //DBHelper class extends SQLiteOpenHelper 

Затем, нажав кнопку, я открываю другое действие и закрываю dbHelper.

int cuisineId = HelperUtils.getCuisineIdByName(dbHelper,cuisine); 
SingletonGlobalClass.getInstance().setCuisineId(cuisineId); 
String restaurantNameSearchStr = restaurantName.getText().toString().trim(); 
Intent intent = new Intent(); 
intent.setComponent(new ComponentName("ctnxa.android", ctnxa.android.SearchResultActivity")); 
intent.putExtra("searchStr", restaurantNameSearchStr); 
intent.putExtra("option", R.string.restaurant); 
startActivity(intent); 
dbHelper.close(); 

Теперь, когда я нажимаю кнопку «Назад», он возвращается к этой операции. Когда я пытаюсь снова нажать кнопку поиска, он использует dbHelper и работает, как правило, без ошибок. Мое ожидание заключается в том, что он не должен работать, поскольку dbHelper уже закрыт раньше, и его можно восстановить только при вызове метода onCreate(), который не будет вызван в этом случае, поскольку я только нажимаю кнопку (он должен вызывать onResume()). Я действительно смущен. Может ли какой-нибудь орган объяснить, что здесь происходит.

Edit: Это, как я не реализовали dbHelper.close()

@Override 
public synchronized void close() { 
    super.close(); 
} 
+0

в методе close() для класса DBHelper вы правильно закрываете базу данных? Распечатайте метод close(). И как вы объявили свою первую активность в манифесте дополнительными опциями? like launchMode ... – Rick

+0

@ Rabgs: Обновлен вопрос с помощью метода close. – Sush

+0

Вы должны вызвать метод закрытия SQLiteDatabase в методе закрытия базы данных DBHelpber. Пример здесь http://code.google.com/p/android-notes/source/browse/trunk/src/com/bitsetters/android/notes/DBHelper.java?r=10 – Rick

ответ

2

Когда вы начинаете новый Activity, первый Activity может или не может пройти через различные «выход» стадии, но там нет гарантируйте, какие из них пройдут. Это зависит полностью от доступных ресурсов и других факторов на отдельном устройстве.

Первый Activity может просто приостановить, и когда вы вернетесь, он возобновится. Тем не менее, первая операция может быть скорее всего остановлена ​​или даже уничтожена. Нет гарантии, что ОС Android будет делать с первым Activity.

В вашем случае это первый IS, который фактически уничтожается и воссоздается, когда вы возвращаетесь со второго Activity.

Единственный способ проверить это, чтобы переопределить все методы, такие как , onStop и onDestroy и имеет каждый из них используют Log, чтобы показать, какие этапы первого Activity проходит.

+0

Я проверил, поставив точки останова, чтобы увидеть, если он воссоздается. Но нет, он не воссоздается. – Sush

+0

ОК, так что же делает 'HelperUtils.getCuisineIdByName (dbHelper, cuisine)' do? Из того, что вы объясняете, 'dbHelper.close()' не освобождает/отменяет сам 'dbHelper' - он все равно будет ссылаться на экземпляр вашего' SQLiteHelper'. Если 'HelperUtils.getCuisineIdByName (...)' вызывает 'getReadbleDatabase()' или 'getWritableDatabase', тогда поведение имеет смысл. – Squonk

+0

есть. он вызывает getReadableDatabase(). rawQuery неявно. Тогда, пожалуйста, объясните, как это имеет смысл. – Sush

1

вы можете избежать этого путаницы, убедившись, что на протяжении всего жизненного цикла приложения существует только один SQLiteOpenHelper. ознакомьтесь с этим answer для получения дополнительной информации.