10

Bu bir kaç gün için beni deli ediyor. Oldukça karmaşık bir android uygulaması var. Bir sunucudan veri almak ve SQLite veritabanını doldurmak için birden çok iş parçacığı kullanır. SQLiteOpenHelper uzantımıma başvurmak için bir singleton kullanıyorum. Faaliyetlerimin her birinde veritabanını açıp kapatıyorum.Android SQLite SQLiteOpenHelper IllegalStateException - DB Zaten Kapalı Hata

YALNIZCA, 4 etkinlik derinliğindeyken ve sonra da çıkmaya çalıştığımda oluşan bir hata oluşur. OnDestroy() yöntemini onPause() yöntemlerine taşıyarak ve onResume() öğesine yeni bir tane daha ekleyerek dahil olmak üzere veritabanını açıp kapatmanın çeşitli yollarını denedim. http://darutk-oboegaki.blogspot.com/2011/03/sqlitedatabase-is-closed-automatically.html

kod geçirdi ve ben eminim yaptık: Ayrıca şunu da unutmayın

, benim faaliyetleri veritabanı neden olabilir anlıyorum listviews ve ExpandableListViews, çokça kullanan bu maddeye dayanılarak bu yakın etmek ya da tüm imleçlerimi kapatabilirler ya da bir bağdaştırıcıya atanıyorlarsa, startManagingCursor() öğesini çağırıyorlar.

Neler olup bittiğine dair bir ipucu var mı?

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.NativeStart.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.performRestart(Activity.java:3836) 
    at android.app.Activity.performResume(Activity.java:3857) 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3337) 
    ... 10 more 

GÜNCELLEME: Sorunu sabit, ama bu onu sabit NEDEN emin oldum. Yani, belki de birileri açıklayabilir ya da açıklayabilir.

Etkinlik yığınının 4. etkinliğindeyken, db'yi db.close() aracılığıyla kapatmaya çalışıyordum. Bunu nereye koyduğum önemli değil, ihtiyacım olan verileri aldıktan sonra onCreate uygulamasında veya onStop veya onestest'te bu hatayı üretecektir. Eğer db'yi kapatmazsam, sorun bende değil. Yani, bir şey db'nin otomatik olarak kapanmasına neden oluyor. Garip bir şey, bu son etkinlikte bir genişletilebilirListView kullanıyorum, ancak bir cursorAdapter kullanmıyorum. Herhangi bir fikri olan var mı? Bunu anlamak isterim.

cevap

19

, bunu yanıtlamak ve ne öğrendim tarif etmek istediğini ve neyi benim büyük, veritabanına dayalı uygulamada bu sorunu gidermek için benim için çalıştı:

  1. Yönetilen imleçler KULLANMAYIN. Kullanımdan kaldırılmalarının bir nedeni var. Tamamen sorunlu. Gerçekçi olarak, aslında yönetilen bir imleci kullanmanız gereken çok az senaryo var. Bunun yerine, sorgunuzu çalıştırın ve bir nesneyi sonuçlarla doldurun. Birden çok satır için sorgu yapıyorsanız, tüm satırları tutmak için nesnenizin bir ArrayList <> oluşturun. Şimdi yaptığım şey, sorguyu çalıştıran ve dönüşte bir imleç yerine ArrayList <> iletimi geri döndüren bir işlev oluşturmaktır. İmleç fonksiyonun içinde kapatıyorum ve işim bitti. Bir ListViews için artık bir SimpleCursorAdapter kullanamazsınız. Bunların tümünü bir BaseAdapter'e dönüştürün ve doldurmak için ArrayList <> nesnesini kullanın.

  2. TÜM KİTAPLARINIZI KAPATMAYI UNUTMAYIN. Bu da uygulamanızın db bağlantılarında hasara yol açabilir. Bunu yaptığımı sanıyordum ama, kesinlikle bir imleci kapatmadığımı gösteren bir nokta buldum. Yani, uygulamanıza gidin ve hepsini kontrol edin.

Tek bir DatabaseHelper nesnesi kullanıyorum.Aynı örneğe her zaman alıyorum ki benim SQLiteOpenHelper sınıfı içinde statik bir DatabaseHelper nesnesi ilan ediyoruz.

Şimdi artık bu DB hataları alıyor istikrarlı çalışan uygulamam var. Bu bilgilerin size bazı yararlı olmuştur.

2

CursorAdapter.changeCursor kullanın (null), Bu hatanın ortaya çıkmasını yavaşlatabilir, Ancak problom'u tam olarak çözemez, Bilinmeyen zaman aralığı tekrar görünecektir. Bu beni de delirtiyor! Bu soru ilgi iyi bir anlaşma aldı yana

1

Ben de aynı sorunu 'fillWindow() ve IllegalStatementException bir imleç geçersiz deyimi ile db zaten kapalı istisna' vardı. Benim yaptığım o zaman benim OnStop ve OnPause yöntemleri benim onResume ve onStart yöntemlerle ben startManagingCursor diyoruz daha sonra stopManagingCursor diyoruz bir örnek değişkeni yerine bir yöntem değişkene (w/c da SimpleCursorAdapter geliyor) benim imleci oldu.

Benim için benim sorun çözüldü ve ben :) bundan sonra benim LogCat herhangi bir hata veya uyarı iletileri bulmak bu da kimseyi yardımcı Umut etmedi.