J'ai "java.lang.IllegalStateException: base de données non ouverte" - lorsque je change l'orientation de l'écran lors de la mise à niveau de la base de données est en cours.
Lorsque la version de ma base de données change, onCreate() de ma sous-classe SQLiteOpenHelper est appelée. Dans cette méthode, je supprime simplement les tables précédentes, en en créant de nouvelles et en les remplissant de données. La base de données est assez grande et les données sont lues à partir du fichier, donc je remplis les données dans la sous-classe AsyncTask. Donc, voici les parties les plus importantes de mon code.
Activité:"IllegalStateException: base de données non ouverte" - changement d'orientation à l'écran
public class MyActivity extends Activity {
...
private MyOpenHelper dbHelper;
private SQLiteDatabase db;
public void onCreate(Bundle savedInstanceState) {
dbHelper = new MyOpenHelper(this);
db = dbHelper.getWritableDatabase();
...
}
protected void onDestroy() {
if (null != db && db.isOpen() && !db.isDbLockedByOtherThreads()){
db.close();
...
}
...
}
MyOpenHelper:
public class MyOpenHelper extends SQLiteOpenHelper
...
public void onCreate(SQLiteDatabase db) {
db.beginTransaction();
try {
//drop...
//create...
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
/* populate database with data */
SQLiteDatabaseInitializer dbInit = new SQLiteDatabaseInitializer(mContext, db, mDialogHost, "db.txt");
dbInit.execute();
}
Je sais que le problème est que lorsque je change l'orientation de l'écran, db exemple se ferme - dans Activity.onDestroy(). Mais je dois le fermer finalement. Quelle est la meilleure approche ici? Quelqu'un a-t-il connu le même problème?
En fait, l'activité additionnelle semble être une bonne idée. Je suis déjà en train d'afficher la boîte de dialogue de progression, afin que l'utilisateur soit informé du long fonctionnement en cours. Je vais essayer et vous faire savoir si cela fonctionne. – Ramps
Ok, votre idée avec une activité supplémentaire était vraiment géniale. Cela fonctionne parfaitement bien pour moi. Juste une petite modification à la proposition de mmeyer: android: screenOrientation = "paysage" n'empêche pas l'activité d'être détruite. Pour vous assurer que votre activité n'est pas détruite, vous devez gérer vous-même les changements de configuration en ajoutant ceci: android: configChanges = "keyboard | keyboardHidden | orientation". Merci beaucoup pour votre solution! Cordialement! – Ramps
... et bien sûr la méthode onConfigurationChanged() doit être surchargée dans Activity – Ramps