web-dev-qa-db-ja.com

カーソルは事前にclose()なしで確定されましたAndroid

私のアプリケーションでは、リストビューがあります。 SQLiteDatabaseからのクエリでデータを取得します。データベースからデータを取得すると、次のエラーが発生します。 error

20行目から21行目に行くと発生します。 occur

Cursor.deactivate()とcursor.close()をregel 50に配置してみましたが、結果はありませんでした。誰もがなぜこのエラーが発生するのか、そしてそれを解決する方法を知っていますか?ありがとう:)

19
Timon Devos

データベースの前にカーソルを閉じる必要があります。コードを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を実行する場合、シーケンスを閉じることは非常に重要です。詳細については、 このリンク を参照してください。

25

このような問題を見つけるには、次のようにデバッグバージョンの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

ではごきげんよう、

11
cV2

常に、データベースを閉じる前に、cursor.close()を呼び出してカーソルを閉じることを忘れないでください。これで問題が解決します。

4
Vincy

アクティビティにstartManagingCursor(c)を使用してカーソルのライフサイクルを管理させてください。これで問題ありません。

0
Akhil