Ошибка: попытка запросить уже закрытый курсор

У меня ошибка, но я не могу найти решение. Мое приложение работает над ICS 4.0.3, но оно возвращает ошибку на Android 3.2. Вот код в файле MainActivity.java :

 SQLiteDatabase db = databaseHelper.getReadableDatabase(); Cursor cursor = db.query(DatabaseHelper.TABLE_NAME, new String[]{"_id","isim","icerik"}, null, null, null, null, null); startManagingCursor(cursor); tts=0; while(cursor.moveToNext()){ if(tts==0) { array_spinner=new String[cursor.getCount()+1]; array_spinner[tts]= "FAVORİ"; } array_spinner2[tts+1]= cursor.getString((cursor.getColumnIndex("isim"))); array_spinner3[tts+1]= cursor.getString((cursor.getColumnIndex("icerik"))); tts++; } ss2 = (Spinner) findViewById(R.id.spinner2); ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(this,R.layout.row2, R.id.weekofday2, array_spinner2); ss2.setAdapter(adapter); } catch (Exception e) {} в SQLiteDatabase db = databaseHelper.getReadableDatabase(); Cursor cursor = db.query(DatabaseHelper.TABLE_NAME, new String[]{"_id","isim","icerik"}, null, null, null, null, null); startManagingCursor(cursor); tts=0; while(cursor.moveToNext()){ if(tts==0) { array_spinner=new String[cursor.getCount()+1]; array_spinner[tts]= "FAVORİ"; } array_spinner2[tts+1]= cursor.getString((cursor.getColumnIndex("isim"))); array_spinner3[tts+1]= cursor.getString((cursor.getColumnIndex("icerik"))); tts++; } ss2 = (Spinner) findViewById(R.id.spinner2); ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(this,R.layout.row2, R.id.weekofday2, array_spinner2); ss2.setAdapter(adapter); } catch (Exception e) {} 

Любые предложения по решению этой проблемы?

Где-то вы закрываете Cursor вы передаете, startManagingCursor() . Перед закрытием Cursor stopManagingCursor() .

Обратите внимание, что startManagingCursor() устарел. Вместо этого, когда ваши данные изменяются, запустите другой запрос в фоновом режиме (например, AsyncTask , CursorLoader ).

Кроме того, вы можете использовать CursorAdapter , например SimpleCursorAdapter , вместо того, чтобы вручную преобразовывать все данные в объекты и использовать ArrayAdapter .

Кроме того, если вы собираетесь использовать ArrayAdapter , объявите его с более конкретным классом (например, ArrayAdapter<String> , а не ArrayAdapter<Object> .

Положите, это может сработать для вас:

  @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); cursor.requery(); } 

Эта ошибка, по-видимому, вызвана неточным использованием устаревшего метода

 startManagingCursor() 

Не может быть на 100% уверен, что правильно вызванный stopManagingCursor() решит проблему, потому что это очень редко.

Я бы рекомендовал не использовать его и придерживаться CursorLoader и LoaderManager.