11

すべてのカーソルが閉じていることを確認するには、次の 2 つのうちどれを使用する必要がありますか?

    Cursor c = getCursor(); 

    if(c!=null && c.getCount()>0){ 
        try{ 
            // read values from cursor 
        }catch(..){} 
        finally{ 
            c.close(); 
        } 
    }//end if
    

また

    Cursor c = getCursor(); 
    try{ 
        if(c!=null && c.getCount()>0){ 
            // read values from cursor 
        }//end if 
    }catch(..){
        
    }finally{ 
        c.close(); 
    } 

お知らせ下さい。

4

7 に答える 7

13

どちらでもありませんが、2 つ目が最も近かったです。

  • getCount() == 0 の場合、オプション 1 はカーソルを適切に閉じません。
  • オプション 2 では、finally ブロックがヌル ポインター例外にさらされたままになります。

私は使うだろう:

Cursor c = getCursor(); 
try { 
    if(c!=null && c.getCount()>0){ 
         // do stuff with the cursor
    }
}
catch(..) {
    //Handle ex
}
finally { 
    if(c != null) {
        c.close(); 
    }
}

...または、カーソルが頻繁に null になることが予想される場合は、カーソルを少し反転させることができます。

Cursor c = getCursor(); 
if(c != null) {
    try { 
        if(c.getCount()>0) { 
             // do stuff with the cursor
        }
    }
    catch(..) {
        //Handle ex
    }
    finally { 
        c.close(); 
    }
}
于 2010-11-10T15:48:51.283 に答える
3

これはさらに優れています:

  • c.getCount() を使用しません - カウントにはデータベースに余分な作業が必要になる場合がありますが、必要ありません
  • クエリ ブロックの前にカーソルを初期化するため、クエリの作成に失敗しても finally ブロックが続かない

コード:

Cursor c = query(....);
if (c != null) {
   try {        
       while (c.moveToNext()) {  // If empty or after last record it returns false.    
          // process row...
       }
   } 
   finally {
       c.close();
    }
}

cエラーまたは空のカーソルの場合は null になる可能性があることに注意してください。https://stackoverflow.com/a/16108435/952135を参照してください。ただし、空のカーソルの場合の null 戻り値はバグとして報告します。

于 2013-08-05T07:32:17.937 に答える
0

何をキャッチしているかにもよりますがc.getCount()、例外がスローされた場合に備えて、2番目のものだと思います。

また、いくつかのインデントはうまくいきません:)

于 2010-11-10T12:18:48.807 に答える
0

主に、2番目のものはisc.close()であっても呼び出そうとするため、最初のものと言えます。また、ドキュメントによると、例外はスローされないため、ブロックに含める必要はありません。cnullgetCount()try

于 2010-11-10T12:26:16.723 に答える
-1

私の答えは最高のものだと思います:

    Cursor cursor = null;

    try {
        cursor = rsd.rawQuery(querySql, null);
        if (cursor.moveToFirst()) {
            do {
                // select your need data from database
            } while (cursor.moveToNext());
        }
    } finally {
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
            cursor = null;
        }
    }
于 2014-09-13T01:58:53.120 に答える
-1

@skylarsutton の質問は正解だと思います。ただし、質問のコードを残したいと思います(回答のコードにはいくつかの欠陥があるようです)。私のコードを使用することを検討してください。

Cursor c = query(....);
if (c != null) {
   try {        
       //You have to use moveToFirst(). There is no quarantee that a cursor is located at the beginning.
       for(c.moveToFirst();!c.isAfterLast();c.moveToNext()) {  
          // process row...
       }
   } 
   finally {
       c.close();
    }
}
于 2016-08-29T08:39:54.187 に答える