0

新しいテーブルの作成をテストするためにアプリケーション データを消去しましたがgetWritableDatabase、サブクラスから呼び出すたびに.SQLiteDatabaseHelperIllegalStateException: database not open

データベースを開こうとすると、「データベースが開いていません」というメッセージが表示される理由がわかりません...

これが私のホームアクティビティ onCreate です。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    mPhotoArr = new ArrayList<File>();

    DBHelper dbHelp = new DBHelper(getApplicationContext());
}

そして、DBHelper クラスのコンストラクターの始まり

public DBHelper(Context context) {
    super(context, "MyDatabase", null, 1);
    db = getWritableDatabase(); //Crashing here
    ...

コールスタックは次のとおりです。

06-16 22:01:07.113: E/AndroidRuntime(24970): FATAL EXCEPTION: main
06-16 22:01:07.113: E/AndroidRuntime(24970): java.lang.RuntimeException: Unable to start activity ComponentInfo{**package**/**package**HomeActivity}: java.lang.IllegalStateException: database not open
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.os.Looper.loop(Looper.java:130)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.app.ActivityThread.main(ActivityThread.java:3687)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at java.lang.reflect.Method.invokeNative(Native Method)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at java.lang.reflect.Method.invoke(Method.java:507)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at dalvik.system.NativeStart.main(Native Method)
06-16 22:01:07.113: E/AndroidRuntime(24970): Caused by: java.lang.IllegalStateException: database not open
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:555)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:137)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at **package**.DBHelper.<init>(DBHelper.java:101)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at **package**.HomeActivity.onCreate(HomeActivity.java:53)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-16 22:01:07.113: E/AndroidRuntime(24970):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
06-16 22:01:07.113: E/AndroidRuntime(24970):    ... 11 more
4

2 に答える 2

0

この質問を見つける可能性のある他の人のために、私が最終的に行ったことを追加します。データベース ヘルパーを保持するために、この回答に従って Application のサブクラスを作成しました。データベースにクエリを実行する必要があるアクティビティまたはアクティビティ内に DAO がある場合は常に、データベースを簡単に取得できるように、Activity のサブクラスを使用してアクティビティが作成されます。

これは、ActionBar Sherlock を使用している場合に機能することに注意してください。必要なのは、適切な ABS アクティビティをサブクラス化することだけです。

于 2013-06-22T17:32:22.790 に答える