热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLiteCantOpenDatabaseException:未知错误(代码14):无法打开数据库(仅在单元测试应用程序时)

如何解决《SQLiteCantOpenDatabaseException:未知错误(代码14):无法打开数据库(仅在单元测试应用程序时)》经验,为你挑选了1个好方法。

所以我最近在我的应用程序中添加了持久性并且我得到了这个错误,但有趣的部分是应用程序运行良好,即使持久化对象检索它们和一切,但在运行单元测试时我得到上面写的错误.

以下是我的应用程序的有趣部分

清单权限:










这是gradle配置defailtConfig块

 compileSdkVersion 24
    buildToolsVersion '25.0.0'


    defaultConfig {
        applicationId "mehungry.com.myapplicationnavigationdawerdemo"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        minSdkVersion 22
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled = true

        jackOptions {
            enabled true
        }
    }

我的DatabaseHelper:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 2;
    public static final String DATABASE_NAME = "MeHungryApp.db";

    private SQLiteDatabase database;

    private final Context context;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.cOntext= context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CreateStatments.ATABLE);
        db.execSQL(CreateStatments.BTABLE);
        db.execSQL(CreateStatments.CTABLE);

        db.execSQL(CreateStatments.DTABLE);
        db.execSQL(CreateStatments.ETABLE);
        db.execSQL(CreateStatments.FTABLE);
        db.execSQL(CreateStatments.GTABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(DatabaseHelper.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + ATableDef.TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + BTableDef.TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + CTableDef.TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + DTableDef.TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + ETableDef.TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + FTableDef.TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + GTableDef.TABLE_NAME);

        onCreate(db);
    }

}

我的数据库测试类(暂时不做任何事)

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MealEntityPersistenceTest {

private SQLiteDatabase database;
private DatabaseHelper databaseHelper;

public MealEntityPersistenceTest() {

}

@Before
public void setUp() {
    databaseHelper = new 
DatabaseHelper(InstrumentationRegistry.getContext());
    database = databaseHelper.getWritableDatabase();
}


@Test
public void testInsertRecipe() {
}


}

这就是我在Android Monitor中的表现

    05-18 18:16:12.437 12672-12672/? I/MonitoringInstrumentation: Activities that are still in CREATED to STOPPED: 0
05-18 18:16:12.438 12672-12695/? E/SQLiteLog: (14) cannot open file at line 30046 of [9491ba7d73]
05-18 18:16:12.439 12672-12695/? E/SQLiteLog: (14) os_unix.c:30046: (2) open(/data/data/mehungry.com.myapplicationnavigationdawerdemo.test/databases/MeHungryApp.db) - 
05-18 18:16:12.441 12672-12695/? E/SQLiteDatabase: Failed to open database '/data/data/mehungry.com.myapplicationnavigationdawerdemo.test/databases/MeHungryApp.db'.
   android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
   at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
   at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218)
   at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:202)
   at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
   at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
   at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
   at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
   at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1181)
   at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
   at mehungry.MealEntityPersistenceTest.setUp(MealEntityPersistenceTest.java:37)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
   at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
   at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
   at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
   at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
   at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
   at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
   at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
   at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
   at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
   at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
   at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
   at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
   at org.junit.runners.Suite.runChild(Suite.java:128)
   at org.junit.runners.Suite.runChild(Suite.java:27)
   at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
   at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
   at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
   at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
   at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
   at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
   at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
   at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
   at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
   at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
                                                       at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853)
05-18 18:16:12.442 12672-12695/? I/TestRunner: failed: testInsertRecipe(mehungry.MealEntityPersistenceTest)
05-18 18:16:12.442 12672-12695/? I/TestRunner: ----- begin exception -----
05-18 18:16:12.443 12672-12695/? I/TestRunner: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
   at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
   at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218)
   at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:202)
   at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
   at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
   at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
   at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
   at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
   at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
   at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1181)
   at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
   at mehungry.MealEntityPersistenceTest.setUp(MealEntityPersistenceTest.java:37)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
   at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
   at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
   at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
   at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
   at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
   at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
   at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
   at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
   at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
   at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
   at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
   at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
   at org.junit.runners.Suite.runChild(Suite.java:128)
   at org.junit.runners.Suite.runChild(Suite.java:27)
   at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
   at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
   at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
   at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
   at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
   at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
   at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
   at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
   at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
   at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
   at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853)
05-18 18:16:12.443 12672-12695/? I/TestRunner: ----- end exception -----

我变得绝望,因为我已经看到了大量类似的问题,但没有任何帮助我,所以任何方向或狂野的猜测将非常感激.



1> nikolis..:

经过一番调查后,我发现问题出在数据库路径上

在测试时:

/data/data/mehungry.com.myapplicationnavigationdawerdemo.test/databases/MeHungryApp.db

运行整个应用程序时:

/data/data/mehungry.com.myapplicationnavigationdawerdemo/databases/MeHungryApp.db

这就是问题,当我更改了DatabaseHelper构造函数调用时,这种不一致性已得到修复

由此 :

databaseHelper = new DatabaseHelper(InstrumentationRegistry.getContext());

对此:

databaseHelper = new DatabaseHelper(InstrumentationRegistry.getTargetContext());

希望它可能在某些方面帮助某人.


推荐阅读
  • Easyui + asp.net mvc + sqlite 开发教程(录屏)适合入门
    第一节:前言(技术简介)EasyUI是一套js的前端框架利用它可以快速的开发出好看的前端系统web它是在jquery的框架基础上面现在越来越多的企业用它来开发web系统 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • SQLite–CONSTRAINTS(约束)约束是数据列在表上执行的规则。这些是用来限制的数据类型可以进入一个表。这样可以确保数据的准确性和可靠性在数据库中。    级或表级约束可 ... [详细]
  • 有没有人用过sqlite?关于tablehasnocolumnnamedcolumn插入数据的时候报上边的错。问题是我明明有这一列。直接在sqlitedevoloper里执 ... [详细]
  • IhaveonedoubtinSqlite.dteTimeDataTypeisVarchar(200)inTablestructure.Iwanttogetresult ... [详细]
  • 州的先生(https:zmister.com)在很多项目中都有使用到SQLite数据库作为数据存储的工具,其中包括一些桌面图形界面程序和线上的Web应用程序。至今为止,它们都运行良 ... [详细]
  • Python使用SQLite1.sqlite3的安装python2.5.x以上版本默认自带sqlite3模块。2.链接sqlite3数据库```#导入sqlite3模块import ... [详细]
author-avatar
用户tkeex06qp1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有