2011-12-25 84 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())。我很困惑。任何機構可以解釋這裏發生的事情嗎?

編輯:這是我如何實現dbHelper.close()

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

在DBHelper類的close()方法中,您是否正確地關閉了數據庫?請打印close()方法。你是如何在清單中聲明你的第一個活動的額外選項? like launchMode ... – Rick

+0

@Rabgs:用close方法更新了問題。 – Sush

+0

您應該調用DBHelpber close方法中的SQLiteDatabase close方法。這裏的示例http://code.google.com/p/android-notes/source/browse/trunk/src/com/bitsetters/android/notes/DBHelper.java?r=10 – Rick

回答

2

當你開始一個新的Activity,第一Activity可能會或可能不會去通過各種「退出」階段,但沒有保證它會經歷哪些。這完全取決於單個設備上的可用資源和其他因素。

第一個Activity可能會暫停,當您返回時它將恢復。但是,第一個Activity很可能會被阻止甚至被銷燬。無法保證Android操作系統會如何處理第一個Activity

在你的情況下,當你從第二個Activity返回時,似乎第一個IS實際上被銷燬並重新創建。

驗證這一點的唯一方法是重寫所有的方法,如,onStoponDestroy,並讓每個人使用Log顯示哪個階段:第一Activity經歷。

+0

我通過放置斷點來測試是否正在重新創建。但沒有,它不會被重新創建。 – Sush

+0

好的,那麼'HelperUtils.getCuisineIdByName(dbHelper,cuisine)'做了什麼?從你的解釋,'dbHelper.close()'不釋放/無效'dbHelper'本身 - 它仍然會引用你的'SQLiteHelper'的實例。如果'HelperUtils.getCuisineIdByName(...)'調用'getReadbleDatabase()'或'getWritableDatabase',那麼行爲就有意義。 – Squonk

+0

是的。它隱含地調用getReadableDatabase()。rawQuery。然後請解釋它是如何合理的。 – Sush

1

通過確保整個應用程序生命週期中只存在一個SQLiteOpenHelper,您可以避免大量的混淆。看看這個answer欲瞭解更多信息。