2011-07-28 8 views
0

私はリストに値を設定し、カーソルから他のものを実行するアクティビティを持っています。私はデータベースに標準のアンドロイド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) 

この問題は明らかにカーソルを再クエリしようとしているときに発生しています。インテントを起動する前にカーソルを手動で閉じると、正常に動作します。しかし、私はそれを手動で再クエリする必要がありますし、startManagingCursor()全体のポイントですか?同じ方法で作成されたアクティビティには2つのカーソルがあり、両方でカーソルを管理し始めると、両方とも再開時にクラッシュが発生します。

カーソルを正しく管理するためのアクティビティを得るために何か必要なことはありますか?おかげさまで

答えて

2

まあ、それはCursor.requery()が償却され、私はそれを呼び出そうとするたびに同じエラーが発生していることが判明しました。 startManagingCursor()は再帰呼び出しを呼び出していましたが、これが原因で問題が発生していました...なぜ再クエリーがこのインスタンスでエラーを引き起こしているのか分かりません。

私はいくつかのコードを再配置し、onResumeがonCreateの直後に呼び出されるので、onCreateではなくonResume()にcursor = SQLHelper.getwhatevercursor()コードを入れました。 Nikolaが推奨するように、私はonPause()のカーソルも閉じています。

これは現在動作しているようです...

3

onPause()cursor.close())のカーソルを閉じてみます。 SimpleCursorAdapterを使用している場合は、アダプターからもカーソルを切り離す必要があります。

希望の場合は、onResume()メソッドのカーソルを再クエリーできます。

+0

ありがとうございました。私はちょうどそれがstartManagementCursorのためのものだと思った...私はカスタムカーソルアダプタを使用していますが、どのように動くかを見ていきます。 – Matt

関連する問題