Мой вопрос, как представляется, связана со следующим вопросом: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
И это наглядно показывает, что состояние курсора закрыто, как и должно быть - так кто-нибудь может понять, почему это должно вызывать исключение?
Какая линия точно бросает ошибку? Я также переместил бы c.close() в предложение finally. –
Исключение выбрасывается из потока System Daemon, я попытаюсь переместиться ближе к концу, хотя, чтобы увидеть, помогает ли это – frak
. Также есть утечка памяти в случае успешного возврата курсора без элементов. Курсор никогда не получает закрыто в этом случае. Я настоятельно рекомендую проверять вещи по одному - проверьте, является ли c нулевой, если да, возвратной ошибкой. Тогда, если это не null, c.getcount(). Если счетчик равен нулю, закройте курсор и т. Д. Всегда помните, чтобы закрыть курсор. –