2010-06-18 6 views
1

Мой вопрос, как представляется, связана со следующим вопросом:IllegalStateException на закрытом Cursor

How to Handle in code IllegalStateException on Cursor?

Код для метода нарушившей выглядит следующим образом:

public boolean isPermanent(String screen_name) { 
    boolean output = false; 
    try { 
     Cursor c = mDb.query(USERS, new String[] {PERMANENT}, NAME + "='" + screen_name + "'", null, null, null, null); 
     if (c != null && c.getCount() > 0) { 
      c.moveToFirst(); 
      output = c.getString(0).contentEquals("C"); 
      c.close(); 
     } 
    } 
    catch (Exception e) { 
     Log.e("DBERR", e.getMessage()); 
    } 
    return output; 
} 

Однако, я смотрю на соответствующий курсор, когда возникает исключение, в Eclipse я вижу следующее:

this SQLiteCursor (id=830061188288) 
mClosed true  
mColumnNameMap null  
mColumns String[1] (id=830061188608)  
mContentObservable ContentObservable (id=830061188456)  
mContentResolver null  
mCount 0 
mCurrentRowID null  
mCursorState 0 
mDatabase SQLiteDatabase (id=830060407768) 
mDataSetObservable DataSetObservable (id=830061188408)  
mDriver SQLiteDirectCursorDriver (id=830061143904) 
mEditTable "users" (id=830060403008) 
mInitialRead 2147483647 
mLock null  
mMaxRead 2147483647 
mNotificationHandler null  
mNotifyUri null  
mPendingData false 
mPos -1 
mQuery SQLiteQuery (id=830061143936) 
mRowIdColumnIndex -1 
mSelfObserver null  
mSelfObserverLock Object (id=830061188504) 
mSelfObserverRegistered false 
mStackTraceElements null  
mUpdatedRows HashMap (id=830061144056) 
mWindow null  

И это наглядно показывает, что состояние курсора закрыто, как и должно быть - так кто-нибудь может понять, почему это должно вызывать исключение?

+0

Какая линия точно бросает ошибку? Я также переместил бы c.close() в предложение finally. –

+0

Исключение выбрасывается из потока System Daemon, я попытаюсь переместиться ближе к концу, хотя, чтобы увидеть, помогает ли это – frak

+0

. Также есть утечка памяти в случае успешного возврата курсора без элементов. Курсор никогда не получает закрыто в этом случае. Я настоятельно рекомендую проверять вещи по одному - проверьте, является ли c нулевой, если да, возвратной ошибкой. Тогда, если это не null, c.getcount(). Если счетчик равен нулю, закройте курсор и т. Д. Всегда помните, чтобы закрыть курсор. –

ответ

1

Вместо проверки c.getCount()> 0, проверьте c.moveToNext():

try{ 
... 
    if (c != null && c.moveToNext()) 
    //do your thing here and don't call moveToFirst() 
} finally { 
    if (c != null) 
    c.close(); 
} 

И переместить близко, наконец, {}

+0

Пока это, похоже, сделало трюк, только время покажет, как это казалось случайным образом, но спасибо вы – frak

+0

moveToNext() вернет false, если запрос возвращает только одну строку. – cdonner

Смежные вопросы