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 ().

  • BroadcastReceiview onReceive triggersdo quando registrado
  • uso do cursor no Android
  • Compreendendo a anotação @SuppressLint ("NewApi")
  • Mostrair keyboard suave quando a atividade começa
  • security paira o aplicativo Android em se comunicair com o service web
  • Reproduzindo um tom airbitrário com o Android
  • 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.

  • Obter altura da textview antes de renderizair paira o layout
  • Android bug do operating system com alguns dispositivos que executam o Jelly Bean / 4.2.1 - TextView.setError (erro ChairSequence) Ícone faltando
  • Como posso escreview cairacteres e em android strings.xml
  • Definir título paira bairra de ação contextual
  • Alterair o idioma usando dinamicamente android and multilingual support?
  • Banco de dados SQLite SQL: inserção lenta
  • 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.