Идиома, чтобы закрыть курсор - PullRequest
11 голосов
/ 10 ноября 2010

Какой из следующих двух я должен использовать, чтобы убедиться, что все курсоры закрыты?

    Cursor c = getCursor(); 

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

    OR

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

    }finally{ 
        c.close(); 
    } 

РЕДАКТИРОВАТЬ:
Несколько вопросов:
1Нужно ли вызывать close () для курсора со счетчиком 0?
2. Поскольку в этом случае для первой идиомы close () никогда не будет вызываться.Предполагается, что для курсора, не имеющего элементов, курсор никогда не будет открыт.Это правильное предположение?

Пожалуйста, сообщите.

Ответы [ 7 ]

13 голосов
/ 10 ноября 2010

Ни один, но второй был ближе всего.

  • Опция 1 неправильно закрывает курсор, когда getCount () == 0
  • Опция 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(); 
    }
}

... или если вы ожидаете, что курсор часто будет нулевым, вы могли бы немного повернуть его головубит:

Cursor c = getCursor(); 
if(c != null) {
    try { 
        if(c.getCount()>0) { 
             // do stuff with the cursor
        }
    }
    catch(..) {
        //Handle ex
    }
    finally { 
        c.close(); 
    }
}
3 голосов
/ 05 августа 2013

Это даже лучше:

  • не использует 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 может быть нулевым в случае ошибки или пустымкурсор.См. https://stackoverflow.com/a/16108435/952135. Я бы сообщал нулевое возвращаемое значение в случае пустого курсора как ошибку, хотя.

1 голос
/ 03 мая 2012

Лучшая практика приведена ниже:

Cursor c = null;    
try {        
   c = query(....);      
   while (c.moveToNext()) {  // If empty or next to last record it returns false.    
      // do stuff..       
   }
} finally {
   if (c != null && !c.isClosed()) {  // If cursor is empty even though should close it.       
   c.close();
   c = null;  // high chances of quick memory release.
}
0 голосов
/ 29 августа 2016

Я думаю, что @ skylarsutton's - правильный ответ на вопрос.Тем не менее, я хочу оставить коды для вопроса (любые коды в ответах, похоже, имеют некоторые недостатки).Пожалуйста, рассмотрите возможность использования моего кода.

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();
    }
}
0 голосов
/ 13 сентября 2014

Мне кажется, мой ответ самый лучший:

    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;
        }
    }
0 голосов
/ 10 ноября 2010

Я бы сказал первый, главным образом потому, что второй попытается вызвать c.close(), даже если c равно null.Кроме того, согласно документам, getCount() не создает исключений, поэтому нет необходимости включать его в блок try.

0 голосов
/ 10 ноября 2010

Зависит от того, что вы ловите, но я бы сказал, второй, на случай, если c.getCount() выдает исключение.

Кроме того, некоторые отступы не сработают:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...