2011-07-28 72 views
0

我有一個活動來填充列表並從遊標執行一些其他操作。我從一個方法獲取遊標,該方法基於標準的android SQLite查詢將其返回到我的數據庫。該方法在我的SQLHelper類中定義。該方法打開數據庫,查詢,關閉數據庫並返回遊標。在活動中收集遊標後,我致電startManagingCursor(cursor);活動未正確管理光標。

所有這些都可以正常工作。

當我啓動一個子活動,然後回到第一個活動時,會出現問題。我得到一個與下列輸出關閉的力量:

07-28 18:11:04.674: ERROR/AndroidRuntime(224): java.lang.RuntimeException: Unable to resume activity {blabla}: java.lang.IllegalStateException: mQuery SELECT * FROM vehicles WHERE _id=? 1 
... 
07-28 18:11:04.674: ERROR/AndroidRuntime(224): Caused by: java.lang.IllegalStateException: mQuery SELECT * FROM vehicles WHERE _id=? 1 
07-28 18:11:04.674: ERROR/AndroidRuntime(224):  at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:162) 
07-28 18:11:04.674: ERROR/AndroidRuntime(224):  at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:536) 

... 
07-28 18:11:04.674: ERROR/AndroidRuntime(224): Caused by: android.database.sqlite.SQLiteMisuseException: library routine called out of sequence: handle 0x0 
07-28 18:11:04.674: ERROR/AndroidRuntime(224):  at android.database.sqlite.SQLiteProgram.native_bind_string(Native Method) 
07-28 18:11:04.674: ERROR/AndroidRuntime(224):  at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:178) 
07-28 18:11:04.674: ERROR/AndroidRuntime(224):  at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:153) 

問題顯然是當它試圖重新查詢遊標時。如果我在啓動intent之前手動關閉遊標,那麼它工作正常。但後來我需要手動重新查詢它,並不是startManagingCursor()的整個點?我在活動中有兩個遊標都以相同的方式創建,我調用開始在兩個遊標上管理遊標,都會導致簡歷崩潰。

有什麼我需要做的,讓我的活動正確管理我的遊標? 謝謝。

回答

2

嗯,事實證明,Cursor.requery()是貶值的,每次我試圖調用它時都會得到相同的錯誤。 startManagingCursor()正在調用requery,因爲我認爲它應該,並且反過來導致我的問題在那裏......我不確定爲什麼在這種情況下,請求會導致錯誤,我以前成功地使用過它。

我最終重新安排了一些代碼,並將onCreate onCreate之後調用onResume()而不是onCreate,將我的遊標= SQLHelper.getwallowcursor()代碼放入onResume()中。按照Nikola的建議,我也關閉了onPause()中的遊標。

這似乎現在工作...

3

嘗試關閉光標onPause()cursor.close())。如果您使用的是SimpleCursorAdapter,則還應該將光標從適配器上分離。

如果您願意,您可以在onResume()方法中查詢光標。

+0

謝謝,這可能是我最終會做的。我只是認爲這是startManagingCursor的用途......我使用自定義遊標適配器,但我會看看它是如何發展的。 – Matt