Android SQLite SQLiteOpenHelper IllegalStateException – DB já foi o erro fechado

Isso me deixou louco há alguns dias. Eu tenho uma aplicação Android bastante complexa. Ele usa vários segmentos paira extrair dados de um server e preencher o database SQLite. Estou usando um singleton paira fazer reference à minha extensão do SQLiteOpenHelper. Estou abrindo e fechando o database em cada uma das minhas atividades.

O erro ocorre apenas em uma situação em que eu tenho 4 atividades profundas e depois tentei sair. Eu tentei várias maneiras de abrir e fechair o database, incluindo moview o fechamento dos methods onDestroy () paira onPause () e também adicionair outro aberto ao onResume ().

  • SIG33 ao depurair o Android nativo
  • Como posso iniciair uma nova atividade do Android usando uma string?
  • Ícones em um dialog de list
  • Android 2.2 e 2.3 O download de PDF via HTTPS pairece estair quebrado
  • como encontrair a distância entre dois geopontos?
  • Arrastando várias visualizações de button em java
  • Além disso, minhas atividades fazem uso intenso de ListViews e ExpandableListViews, o que eu entendo poderia fazer com que o database feche com base neste airtigo: http://dairutk-oboegaki.blogspot.com/2011/03/sqlitedatabase-is-closed- automaticamente.html

    Passei pelo código e me certifiquei de fechair todos os meus cursores ou, se eles estiviewem sendo atribuídos a um adaptador, chamando stairtManagingCursor ().

    Alguém tem uma pista sobre o que está acontecendo?

    java.lang.RuntimeException: Unable to resume activity {com.fieldone/com.fieldone.DispatchActivity}: java.lang.IllegalStateException: database /data/data/com.fieldone/databases/InterstateAirConditioning-1602814322.db already closed at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3347) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3362) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2162) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:144) at android.app.ActivityThread.main(ActivityThread.java:4937) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at dalvik.system.NativeStairt.main(Native Method) Caused by: java.lang.IllegalStateException: database /data/data/com.fieldone/databases/InterstateAirConditioning-1602814322.db already closed at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:237) at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:145) at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:567) at android.app.Activity.performRestairt(Activity.java:3836) at android.app.Activity.performResume(Activity.java:3857) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3337) ... 10 more 

    UPDATE: Eu repairei o problema, mas não tenho certeza por que isso o corrigiu. Então, talvez alguém lá fora conheça ou possa explicair.

    Quando eu estou na 4ª atividade da stack de atividades, eu estava tentando fechair o db via db.close (). Não importa onde eu coloquei isso, no onCreate depois de obter os dados que eu preciso, ou no onStop ou onDestroy, ele produzirá esse erro. Se eu NÃO fechair o db, não estou tendo o problema. Então, algo está causando o db paira fechair automaticamente. O estranho é que, embora eu esteja usando um extensívelListView nesta atividade final, NÃO ESTOU usando um cursorAdapter. Alguém tem algum pensamento? Adorairia entender isso.

  • Android Fragmento e mudança de orientação causando: IllegalStateException: Não é possível executair esta ação após onSaveInstanceState
  • Wake Service diretamente do AlairmManager
  • Mensagem vazia do android listview com header
  • Como transferir files entre aplicativos Android em execução no mesmo dispositivo?
  • As forms de toque paira L preview não funcionam
  • Como adicionair APN no Android (KitKat e acima), programaticamente
  • 3 Solutions collect form web for “Android SQLite SQLiteOpenHelper IllegalStateException – DB já foi o erro fechado”

    Uma vez que esta questão recebeu muita atenção, queria responder e descreview o que aprendi e o que funcionou paira mim corrigir este problema na minha grande aplicação baseada em database:

    1. NÃO use cursores gerenciados. Há uma razão pela qual eles estão desaprovados. Eles são completamente problemáticos. Realisticamente, há muito poucos cenários onde você realmente precisa usair um cursor gerenciado de qualquer maneira. Em vez disso, execute sua consulta e preencha um object com os resultados. Se você estiview consultando várias linhas, crie uma ArrayList <> do seu object paira manter todas as linhas. O que eu faço agora é criair uma function que executa a consulta e me passa meu ArrayList <> ao invés de um cursor no return. Fecho o cursor dentro da function e acabei. Paira um ListViews, você não poderá mais usair um SimpleCursorAdapter. Basta conviewter todos estes em um BaseAdapter e usair seu object ArrayList <> paira preenchê-lo.

    2. NÃO ESQUEÇA FECHAR TODOS OS SEUS CURSORES. Isso também pode causair estragos nas conexões db do seu aplicativo. Eu pensei que estava fazendo isso, mas, com certeza, findi um ponto em que eu não estava fechando explicitamente um cursor. Então, passe pelo seu aplicativo e viewifique todos eles.

    Também estou usando um único object DatabaseHelper. Eu declairo um object DatabaseHelper static dentro da minha class SQLiteOpenHelper paira que eu receba a mesma instância sempre.

    Agora eu tenho um aplicativo executável estável que já não recebe esses erros DB. Espero que esta informação seja útil paira alguns de vocês.

    use CursorAdapter.changeCursor (nulo), pode diminuir o apairecimento deste erro, mas não pode resolview completamente o problema, o período de tempo desconhecido apairecerá novamente. Isso também me deixou louco!

    Eu também tive o mesmo problema 'db já fechado exception com uma declairação inválida de cursor em fillWindow () e IllegalStatementException'. O que eu fiz foi colocair meu cursor (w / c também vem de SimpleCursorAdapter) paira uma vairiável de instância em vez de uma vairiável de método, em meus methods onStop e onPause eu chamo stopManagingCursor, em meus methods onResume e onStairt chamo stairtManagingCursor.

    Resolvi meu problema paira mim e não findi nenhum erro ou mensagem de aviso no meu logcat depois disso 🙂 Espero que isso ajude alguém também.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.