2015-05-13 71 views
3

如果您是一位有經驗的Android程序員,您可能知道屏幕方向會導致應用程序通過onSaveInstanceState()和onRestoreInstanceState進行保存和恢復。屏幕旋轉導致SQLite的安全調用出現問題

你可能也知道,對象是不容易通過這些功能得以恢復,例如,如果我創建一個數據庫連接,如下所示:

SQLiteDatabase mydb = openOrCreateDatabase(dbn.trim().toLowerCase(), 0, null); 

然後我執行一個查詢,用於加載紀錄如下:

Cursor rs = mydb.rawQuery("SELECT * FROM MY_TABLE where id>0", null); 

之後我就可以通過讀取下一個匹配的記錄:

rs.moveToNext(); 

現在這裏出現半壞消息......如果在我剛剛解釋過的對SQLite的安全調用期間,用戶傾斜設備,所有內容都會被刪除並恢復,除了包含結果集的Cursor之類的對象。所以,即使SQLite連接重置!

現在,我知道在這樣的任務期間,我們可以鎖定屏幕方向,無論我們是通過編程還是通過Android Manifest。所以,沒問題。

現在,對於壞消息......當您使用startActivityForResult()調用Intent時,無法控制調用功能的屏幕方向!因此,即使您專門配置了應用程序以鎖定方向,主機應用程序也會旋轉。而且這似乎沒有一個直觀的修復。

這會導致從空指針到各種崩潰的一系列問題。

我沒有控制何時用戶將完成secuential SQLite調用,或者當用戶將調用startActivityForResult(),有沒有辦法避免這一切?我正在考慮是否會有一種方法來鎖定整個設備的屏幕旋轉編程....

+0

你能不能保存的位置,然後使用'Cursor.moveToPosition(指數)'當你發現屏幕旋轉? – ChrisStillwell

+0

由於索引是一個整數,是的,我可以保存遊標的位置。但是我不能保存遊標本身,因爲它不是一個可序列化的對象。數據庫連接本身也一樣。我可以簡單地重新打開數據庫,但對於遊標,我需要重新發出查詢,這可能是資源密集型的。 – Brian

+0

啊對了,我雖然你重新打開數據庫。那爲什麼不使用[ContentQueryMap](http://developer.android.com/reference/android/content/ContentQueryMap.html)?它可以保存一個光標。 – ChrisStillwell

回答

2

您可以覆蓋配置更改,使應用程序不會在屏幕旋轉期間關閉。在您的清單部分,把

android:configChanges="orientation|screenSize" > 

這將調用Activity.onConfigurationChanged()在你的應用程序時,方向或屏幕尺寸的變化,而不是重新啓動它。

在我的應用程序,我要做的就是這個(這在技術上並不需要):

@Override public boolean onConfigurationChanged (Configuration newConfig) 
{ 
    super.onConfigurationChanged (newConfig); 
} 

我並不需要添加任何代碼刷新意見 - 他們被自動失效和再生。

有關詳細信息,請參閱 http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

傑出。有用。我仍然認爲這種方式重新啓動應用程序是一種愚蠢的行爲。操作系統應該能夠自動完成,而不必這麼做。謝謝Peri。 :) – Brian