«IllegalStateException: база данных не открыта» - при изменении ориентации экрана - PullRequest
2 голосов
/ 16 октября 2010


У меня «java.lang.IllegalStateException: база данных не открыта» - когда я меняю ориентацию экрана во время обновления базы данных.
Когда изменяется версия моей базы данных, вызывается onCreate () моего подкласса SQLiteOpenHelper. В этом методе я просто удаляю предыдущие таблицы, создавая новые и заполняя их данными. База данных довольно большая, и данные считываются из файла, поэтому я заполняю данные в подклассе AsyncTask.

Итак, вот самые важные части моего кода.
Активность:

 
 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();
   }

Я знаю, что проблема в том, что когда я меняю ориентацию экрана, экземпляр db закрывается - в Activity.onDestroy (). Но я должен закрыть это в конце концов. Каков наилучший подход здесь? Кто-нибудь испытывал такую ​​же проблему?

1 Ответ

1 голос
/ 16 октября 2010

Не могли бы вы попытаться принудить действие к определенной ориентации, чтобы оно не могло перейти в другую ориентацию?

<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> 

Если это проблематично для общего использования вашего приложения, рассмотрите возможность перенести процесс обновления БД на новый вид деятельности, который можно безопасно заблокировать для определенной ориентации, а затем переключиться обратно на другой после завершения обновления БД.

Я думаю, что вы все еще можете столкнуться с подобной проблемой, если пользователь закроет ваше приложение, пока происходит ваше долгосрочное обновление.

Дополнительное действие также может дать вам место, чтобы предупредить пользователя не прерывать действие во время обновления.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...