2011-09-26 1 views
1

Lorsque j'applique normalement le service SQLiteOpenHelper, la base de données est normalement fermée dans la méthode onDestroy(). il est la force fermée, la base de données est laissée ouverte et plus tard, quand mon application tente de lire la base de données en utilisant getReadableDatabase(), il est écrasé avec le message suivant:Rouvrez SQLiteOpenHelper lorsque mon application est arrêtée car "close()" n'a jamais été explicitement appelé dans la base de données "

09-26 13:45:30.995: ERROR/Database(12632): close() was never explicitly called on database

Voici la pleine LogCat:

09-27 03:10:04.331: ERROR/Database(391): close() was never explicitly called on database '/data/data/myApplication/databases/DownloadDatabase1' 
09-27 03:10:04.331: ERROR/Database(391): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
09-27 03:10:04.331: ERROR/Database(391):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847) 
09-27 03:10:04.331: ERROR/Database(391):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
09-27 03:10:04.331: ERROR/Database(391):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854) 
09-27 03:10:04.331: ERROR/Database(391):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847) 
09-27 03:10:04.331: ERROR/Database(391):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:544) 
09-27 03:10:04.331: ERROR/Database(391):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
09-27 03:10:04.331: ERROR/Database(391):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
09-27 03:10:04.331: ERROR/Database(391):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) 

I a suivi la trace de la pile et je pense que l'exception est en raison de la ligne suivante de code:

setLocale(Locale.getDefault());

Code Th ci-dessus est à partir du fichier SQLiteDatabase.java. Des suggestions sur la façon de résoudre ce problème?

+3

s'il vous plaît signaler l'ensemble du logcat – NSjonas

Répondre

1

Je vous recommande de fermer la base de données dès que vous avez fini de travailler avec elle. Ouvrir et fermer la base de données chaque fois que vous devez préformer une transaction n'est pas non plus une mauvaise idée. À moins que votre application n'écrive constamment des données, vous ne devriez pas perdre les performances.

+0

Cela ne résout pas complètement le problème, car l'application pourrait être forcée lorsque la base de données est en cours d'utilisation. – Jim

+0

Je pense que leur doit être quelque chose d'autre. J'ai eu mon application FC plusieurs fois avant de fermer la base de données. Cela ne devrait pas vous empêcher de l'ouvrir de nouveau. Je reçois aussi ce message d'erreur, mais il ne provoque jamais un plantage. Assurez-vous que votre analyse de l'ensemble du logcat pour l'exception – NSjonas

+0

mon application télécharge plusieurs fichiers à partir d'un serveur Web et j'utilise sqlite pour enregistrer mon état de téléchargements et de progrès. J'ai donc beaucoup de requêtes de mise à jour par téléchargement, et je pense qu'il n'est pas efficace d'ouvrir et de fermer la base de données pour chaque requête. comment j'ai essayé cette idée, mais je ne sais pas comment ouvrir la base de données après la fermeture. J'utilise sqliteOpenHelper, et il ouvre la base de données implicitement quand j'appelle getReadableDatabase ou getWritableDatabse. mais quand je le ferme explicitement, appeler getReadbleDatabse provoquera une exception que la base de données est fermée avant. merci pour votre réponse! – Ali

2

Même si cela donne cette erreur, vous devriez pouvoir accéder à la base de données. En regardant le code sous-jacent, je crois comprendre qu'une telle erreur ne devrait pas entraîner votre programme pour quitter: http://hi-android.info/src/android/database/sqlite/SQLiteDatabase.java.html

y faire le compte méthode finalize(). Vous verrez, il essaie juste de nettoyer, il ne jette pas d'exception.

Vous devez avoir un problème ailleurs.

+0

oui. en raison de la trace de la pile, je pense que l'exception se produit dans le constructeur de SQLiteDatabase. – Ali

Questions connexes