无法在Android测试应用中打开数据库

时间:2011-02-23 08:59:56

标签: android

我正在尝试在Android应用程序中测试SQLiteOpenHelper子类的插入和检索方法。 SQLLiteHelper子类存在于测试中的应用程序中,并在安装文件夹中创建数据库。但是,单元测试存在于测试应用程序的InstrumentTestCase中,我想在测试应用程序中创建一个测试数据库。

不幸的是,如果我尝试在测试应用中创建/打开数据库,我会遇到以下异常:

android.database.sqlite.SQLiteException: unable to open database file
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168)
at com.kizoom.android.mybus.storage.MyStopsDatabase.getMyStops(MyStopsDatabase.java:63)
at com.kizoom.mybus.test.MyStopsDatabaseTest.testGetMyStops(MyStopsDatabaseTest.java:24)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:191)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:181)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:164)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:151)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:425)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1520)

The following information appears in LogCat.

02-21 11:52:16.204: ERROR/Database(1454): sqlite3_open_v2("/data/data/com.kizoom.mybus.test/databases/MyStops", &handle, 6, NULL) failed

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): Couldn't open MyStops for writing (will try read-only):

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): android.database.sqlite.SQLiteException: unable to open database file

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584)

02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)

有人知道为什么会失败吗?

2 个答案:

答案 0 :(得分:33)

在创建db帮助程序期间,我没有使用getInstrumentation().getContext()作为上下文,而是将其更改为getInstrumentation().getTargetContext()并且它可以正常工作。

答案 1 :(得分:4)

我在TestDatabaseHelper * -TestCases中使用以下setUp() - Method:

@Override
    protected void setUp() throws Exception {
        super.setUp();
        final SQLiteDatabase db = SQLiteDatabase.create(null);
        Context context = new MockContext() {
            @Override
            public SQLiteDatabase openOrCreateDatabase(String file, int mode, SQLiteDatabase.CursorFactory factory) {
                return db;
            };
        };
        mHelper = new MyCustomSubclassOfDatabaseHelper(context);
        mDb = mHelper.getWritableDatabase();
        wipeData(mDb);
    }
    public void wipeData(SQLiteDatabase db) {
        db.execSQL("DELETE FROM " + TABLENAME + ";");
    }

这很酷,因为文档说的是SQLiteDatabase.create():

  

创建一个支持内存的SQLite数据库。它的内容将被销毁   数据库关闭时。

因此,您的测试数据库不会保留,您可以轻松测试自定义插入/更新/查询/删除方法。

希望这会有所帮助。如果还有任何问题,请随时提出。

干杯, 克里斯托弗