«Невозможно открыть файл базы данных» при использовании SQLiteOpenHelper с контекстом инструментария - PullRequest
2 голосов
/ 15 ноября 2010

Я пытаюсь создать базу данных, которая содержит фиктивные объекты для целей тестирования. Я бы предпочел, чтобы эта БД находилась в моем тестовом пакете, а не в пакете приложения.

protected class MockObjectOpenHelper extends SQLiteOpenHelper {

    MockObjectOpenHelper() {
        super(instrumentation.getContext(), FILE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        ...
    }
}

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

Есть ли способ заставить мое приложение создавать и получать доступ к базе данных, которая находится в моем тестовом проекте?

Исключение:

14:50:13.917 pool-1-thread-1 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.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:659)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:652)
at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:482)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
at com.myapp.test.http.DbMockHttpClient.createClientRequestDirector(DbMockHttpClient.java:52)
at com.myapp.test.http.UniversalMockHttpClient.createClientRequestDirector(UniversalMockHttpClient.java:42)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:539)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
E

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Я не был разбит решением @Yves, потому что оно приводит к созданию баз данных, созданных в папке протестированного приложения.Это может потенциально помешать работе приложения (например, очистка баз данных во время тестов).

Я провел некоторые исследования.Эта ошибка возникает из-за того, что каталог «database» не может быть создан, и когда движок SQL пытается открыть файл «database / dbname.db», он не может найти папку «database».

Обычно контекст отвечает заСоздание папки «Базы данных» непосредственно перед первым созданием базы данных.Но это терпит неудачу, потому что у него есть недопустимые разрешения.И вот почему.

Предположим, что протестированный проект установлен с пользователем app_100, а проект Tester установлен с пользователем app_101.Когда выполняются тесты, инструментарий запускается с использованием пользователя app_100, а не app_101.И app_100 не имеет права создавать папку в личной папке app_101.

Самый простой способ решить эту проблему - добавить одно и то же значение в "android: sharedUserId" int Tester и Tested AndroidManifest.xml.Таким образом, оба .apk будут установлены с одним и тем же пользователем (в нашем примере это будет app_100).

1 голос
/ 31 декабря 2010

У меня была такая же проблема.Использование контекста приложения помогло мне:

this.getActivity().getApplicationContext()

вместо

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