2011-10-26 12 views
0

データベースアダプタで次のルーチンを使用しています。呼び出されるたびに、「アプリケーションがカーソルを閉じなかった」というエラーが作成されます。アンドロイドカーソルが閉じていないエラー

私は呼び出しルーチンでそれを開いていないので、どのようにカーソルを閉じることができません。これは、リスト内のディスプレイアダプタ内で使用されます。

public int dbio_rcount(String p_query) 
{ 
    int v_ret = 0 ; 
    Cursor mCursor = null ; 

    try 
    { 
     mCursor = mDb.rawQuery(p_query, null); 
    }catch (SQLException e) {} 

    if ( (mCursor != null) 
     && (mCursor.moveToFirst())) 
    { 
     v_ret = mCursor.getInt(0); 
    } 
    mCursor.close(); 

    return v_ret ; 
} 

答えて

5

私の推測では、あなたということです。(フィールド1 = 'V' のどこmytableはから「SELECT COUNT(*)))

int型CNT = mDbHelper.dbio_rcount:

私はそれを呼び出していますアプリケーションがmCursor.close()が起こる前にクラッシュすることを意味するmCursor.moveToFirst()呼び出しで例外が発生しています。 通常、私はmoveToFirst()を呼び出す前にmCursor.getCount()> 0をチェックします。しかしそれは私だけです。私はこれを提案します:

public int dbio_rcount(String p_query) 
{ 
     int v_ret = 0 ; 
     Cursor mCursor = null ; 

     try 
     { 
      mCursor = mDb.rawQuery(p_query, null); 
      if (mCursor != null && mCursor.getCount() > 0) 
      { 
       mCursor.moveToFirst(); 
       v_ret = mCursor.getInt(0); 
      } 
     } catch (SQLException e) { 
     Log.e(TAG, "sql exception in dbio_count", e);    
     } catch(Exception ex) { 
     Log.e(TAG, "other exception in dbio_count", ex); 
     } finally { 
     if (mCursor != null) { 
      mCursor.close(); 
     } 
     } 

     return v_ret ; 
    } 
+0

moveToFirst()は例外をスローしないように見えます。また、私はrawQueryを使用していません。あなたはこれを試してみるとよいでしょう。これはクローズされていないカーソルですか? –

+0

例外についてはあなたが正しいと思いますが、 'moveToFirst'ではなく' rawQuery'で起こっています。スローされる例外をスローする 'rawQuery'の周りにtry/catchがあります。あなたの修正はどちらかの方法で動作するはずです。しかし、私は 'mCursor.close()'の前にヌルチェックを追加します。 'rawQuery'が' mCursor'を投げている場合、あなたの 'finally'ブロックではnullになります。 – goto10

+0

良い点、nullのチェックが追加されました –

関連する問題