私のアプリケーションでは、リストビューがあります。 SQLiteDatabaseからのクエリでデータを取得します。データベースからデータを取得すると、次のエラーが発生します。
20行目から21行目に行くと発生します。
Cursor.deactivate()とcursor.close()をregel 50に配置してみましたが、結果はありませんでした。誰もがなぜこのエラーが発生するのか、そしてそれを解決する方法を知っていますか?ありがとう:)
データベースの前にカーソルを閉じる必要があります。コードをtry
/catch
ブロックとfinally
ブロックに入れ、カーソルを閉じてからデータベースを閉じます。
try {
db = ...
} catch(Exception ex) {
// Log the exception's message or whatever you like
} finally {
try {
if( cursor != null && !cursor.isClosed())
cursor.close();
if( db.isOpen() )
db.close();
} catch(Exception ex) {}
}
DBまたはコンテンツプロバイダーでIOを実行する場合、シーケンスを閉じることは非常に重要です。詳細については、 このリンク を参照してください。
このような問題を見つけるには、次のようにデバッグバージョンのStrictModeを有効にします。
public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
super.onCreate();
}
詳細情報@ http://developer.Android.com/reference/Android/os/StrictMode.html
ではごきげんよう、
常に、データベースを閉じる前に、cursor.close()を呼び出してカーソルを閉じることを忘れないでください。これで問題が解決します。
アクティビティにstartManagingCursor(c)
を使用してカーソルのライフサイクルを管理させてください。これで問題ありません。