“IllegalStateException:数据库未打开” - 屏幕方向更改

时间:2010-10-16 18:47:51

标签: android sqlite


我有“java.lang.IllegalStateException:数据库未打开” - 当我在升级数据库时更改屏幕方向时。
当我的数据库版本更改时,将调用我的SQLiteOpenHelper子类的onCreate()。在这个方法中,我只是删除以前的表,创建新的表并用数据填充它们。数据库非常大,数据是从文件中读取的,所以我在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 个答案:

答案 0 :(得分:1)

您是否可以尝试将活动强制转换为特定方向,以便无法转换到其他方向?

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

如果这对应用程序的整体使用有问题,请考虑将数据库更新过程移动到可以安全锁定到特定方向的新活动,然后在完成数据库更新后切换回另一个活动。 / p>

如果用户在您的长时间运行更新期间退出您的应用,我认为您可能仍会遇到类似的问题。

附加活动还可以为您提供一个警告用户在更新时不要中断活动的地方。

希望有所帮助。