如果您是一位有經驗的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(),有沒有辦法避免這一切?我正在考慮是否會有一種方法來鎖定整個設備的屏幕旋轉編程....
你能不能保存的位置,然後使用'Cursor.moveToPosition(指數)'當你發現屏幕旋轉? – ChrisStillwell
由於索引是一個整數,是的,我可以保存遊標的位置。但是我不能保存遊標本身,因爲它不是一個可序列化的對象。數據庫連接本身也一樣。我可以簡單地重新打開數據庫,但對於遊標,我需要重新發出查詢,這可能是資源密集型的。 – Brian
啊對了,我雖然你重新打開數據庫。那爲什麼不使用[ContentQueryMap](http://developer.android.com/reference/android/content/ContentQueryMap.html)?它可以保存一個光標。 – ChrisStillwell