将SQLiteOpenHelper与检测上下文一起使用时,“无法打开数据库文件”

时间:2010-11-15 18:35:35

标签: android sqlite

我正在尝试创建一个包含模拟对象的数据库以进行测试。我希望将这个db驻留在我的测试包而不是我的应用程序包中。

protected class MockObjectOpenHelper extends SQLiteOpenHelper {

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

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

当我从我的应用程序中创建SQLiteOpenHelper时,我传入了检测上下文以及与我的测试包的数据库目录相关的路径。我认为这将允许我在我的测试包中创建一个数据库,但似乎并非如此。永远不会在我的测试包中创建“databases”目录。

有没有办法让我的应用创建并访问驻留在我的测试项目中的数据库?

例外:

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 个答案:

答案 0 :(得分:3)

我没有使用@Yves解决方案,因为它导致在测试的应用程序的文件夹中创建数据库。这可能会干扰应用程序(如在测试期间清除数据库)。

我做了一些调查。抛出此错误是因为无法创建“databases”目录,并且当SQL引擎尝试打开“databases / dbname.db”文件时,无法找到“databases”文件夹。

通常Context负责在第一次创建数据库之前创建“databases”文件夹。但它失败了,因为它具有无效的权限。这就是原因。

假设已经使用用户app_100安装了测试项目,并且用户app_101安装了Tester项目。测试运行时,Instrumentation使用app_100用户运行,而不是app_101。并且app_100无权在app_101私人文件夹中创建文件夹。

解决此问题的最简单方法是将相同的值添加到“android:sharedUserId”int Tester和Tested AndroidManifest.xml。这样两个.apk都将与同一用户一起安装(在我们的示例中,这将是app_100)。

答案 1 :(得分:1)

我有同样的问题。使用应用程序上下文为我做了诀窍:

this.getActivity().getApplicationContext()

而不是

instrumentation.getContext()