【问题标题】:"Unable to open database file" when using SQLiteOpenHelper with instrumentation context使用带有检测上下文的 SQLiteOpenHelper 时“无法打开数据库文件”
【发布时间】:2010-11-15 18:35:35
【问题描述】:

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

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

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

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

    我进行了一些调查。抛出此错误是因为“databases”目录创建失败,SQL 引擎尝试打开“databases/dbname.db”文件时找不到“databases”文件夹。

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

    假设 Tested 项目使用用户 app_100 安装,Tester 项目使用用户 app_101 安装。运行测试时,仪器使用 app_100 用户运行,而不是 app_101。而app_100无权在app_101私有文件夹中创建文件夹。

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

    【讨论】:

    • 这对我有帮助。我花了一段时间才弄清楚的另一个问题是 sharedUserId 显然需要在名称中包含一个点。
    【解决方案2】:

    我有同样的问题。使用应用程序上下文对我有用:

    this.getActivity().getApplicationContext()
    

    而不是

    instrumentation.getContext()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多