2010-10-16 5 views
2


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?

Répondre

1

Pourriez-vous essayer de forcer l'activité à une orientation particulière afin qu'elle ne puisse pas basculer vers l'autre orientation?

<activity android:name=".views.AfterActionReview" android:label="@string/app_name" 
       android:screenOrientation="landscape"> 
      <intent-filter> 
       <action android:name="android.intent.action.DEFAULT" /> 
       <category android:name="android.intent.category.VIEW" /> 
      </intent-filter> 
</activity> 

Si cela est problématique pour l'utilisation globale de votre application, envisagez de déplacer le processus de mise à jour de db à une nouvelle activité que vous pouvez en toute sécurité verrouiller une orientation particulière, puis le remettre à l'autre lorsque vous avez terminé avec le mise à jour db

Je pense que vous pouvez toujours rencontrer un problème similaire si l'utilisateur quitte votre application pendant que votre mise à jour de longue durée est en cours. L'activité supplémentaire peut également vous donner une place pour avertir l'utilisateur de ne pas interrompre l'activité lors de la mise à jour.

Espérons que ça aide.

+0

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

+0

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

+0

... et bien sûr la méthode onConfigurationChanged() doit être surchargée dans Activity – Ramps

Questions connexes