0

我清除了我的应用程序数据以测试创建一个新表,但是每当我getWritableDatabase从我的子类调用时SQLiteDatabaseHelper,我都会得到一个IllegalStateException: 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

1

如果您不想使用自定义 DataSource 帮助程序类,那么我会像这样获取对您的数据库的引用:创建对扩展 SQLiteOpenHelper 的自定义类的引用,然后调用myReferenceToSQLiteOpenHelper.getWriteableDatabase()并将其存储在 SQLiteOpenHelper 引用中你的活动。之后,您可以进行任何您需要的操作。只需确保完成后关闭数据库即可。

像这样:

MySQLiteOpenHelper mHelper = new MySQLiteOpenHelper(context);
SQLiteOpenHelper sHelper = mHelper.getWritableDatabase();
于 2013-06-17T04:07:56.823 回答
0

添加我最终为可能找到此问题的其他人所做的事情。我根据这个答案创建了一个应用程序的子类来保存我的数据库助手。每当我有一个活动或活动中的 DAO 需要查询我的数据库时,就会使用活动的子类创建活动,以便更轻松地检索数据库。

请注意,这在使用 ActionBar Sherlock 时确实有效 - 您只需对适当的 ABS 活动进行子类化。

于 2013-06-22T17:32:22.790 回答