Android SqliteContoPendDatabaseException:未知错误(代码14)无法打开数据库

Android SqliteContoPendDatabaseException:未知错误(代码14)无法打开数据库,android,sqlite,sqliteopenhelper,Android,Sqlite,Sqliteopenhelper,当我试图获取可读或可写的数据库时,会出现此错误。 “SqliteContoPendDatabaseException:未知错误(代码14)无法打开数据库” 我在SQLiteOpenHelper上遇到了一个奇怪的问题,我在这里看到了一些关于这个问题的类似答案,但没有一个解决了我的问题。 就像我一样绝望,我把我的代码贴在下面,希望有人能找到我没有看到的东西 (一个重要信息:我从另一个正在运行的应用程序获得此应用程序。但在我第一次调试它时,我仍然没有更改dbname。它与上一个应用程序的名称(ks.d

当我试图获取可读或可写的数据库时,会出现此错误。 “SqliteContoPendDatabaseException:未知错误(代码14)无法打开数据库” 我在SQLiteOpenHelper上遇到了一个奇怪的问题,我在这里看到了一些关于这个问题的类似答案,但没有一个解决了我的问题。 就像我一样绝望,我把我的代码贴在下面,希望有人能找到我没有看到的东西

(一个重要信息:我从另一个正在运行的应用程序获得此应用程序。但在我第一次调试它时,我仍然没有更改dbname。它与上一个应用程序的名称(ks.db)相同。此db存在于我的调试设备中,但tr.db不存在)

我的DatabaseHelper类如下所示:

//Singleton
private static DatabaseHelper sInstance;

//Log
private static String TAG = "Database";

private static final String NAME_DB = "tr.db";
private static final String PATH_DB_DEBUG = "/mnt/sdcard/";
private static final int VERSION = 4;

//TABLE NAMES
private static final String TABLE_USERS = "users";
private static final String TABLE_TRACKS = "tracks";
private static final String TABLE_ROTAS = "rotas";
...
/**
     *
     * @param context
     * @return Unique instance of DataBaseHelper
     */
    public static synchronized DatabaseHelper getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new DatabaseHelper(context.getApplicationContext());
        }
        return sInstance;
    }
我的android清单:

在主要活动中:

    //DB
    DatabaseHelper database;
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
...
        //database
        database = DatabaseHelper.getInstance(this.getApplicationContext());
        database.getReadableDatabase(); ( <- Error HERE)

targetSdkVersion从23更改为22后,错误停止显示。
此降级强制卸载设备上的软件包,重新安装后效果良好。谢谢你的帮助

您正在一个可能不存在的文件路径上使用
SQLiteDatabase.openDatabase
。在
SQLiteDatabase.openDatabase
call之前添加以下两行

   private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {

        String myPath = DB_PATH + DB_NAME;

        File file = new File(myPath);
        if (file.exists() && !file.isDirectory())
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
        // database does't exist yet.
    }

    if (checkDB != null) {
        checkDB.close();
    }

    return checkDB != null ? true : false;
}

为什么要硬编码这个有趣的路径
private static final String path_DB_DEBUG=“/mnt/sdcard/”?我这样做是为了避免我的设备根目录检查数据库。因此,在构造函数中执行了以下操作:
privatedatabasehelper(Context Context){super(Context,(BuildConfig.BUILD_TYPE==“debug”)?PATH_DB_debug+DB_NAME:DB_NAME,null,VERSION)}
这对其他两个应用程序有效,但我在这一个应用程序中遇到了此错误。您应该使用模拟器进行开发。只有在您满意后,才可使用您的设备进行最终测试。无论如何,这条路径很有趣,因为不是所有的设备都在这条路径上安装SD卡。谢谢你打开我的眼睛。我删除了有趣的路径,现在它正在工作。是否有一个安全的存储路径可供使用?您应该调试该路径并查看它返回什么。也许,你得在这个问题上做点手脚。或者尝试其他的环境方法来获得不同的路径。这是一篇我知道的老文章,但是这个解决方案对我很有效。你能解释一下到底发生了什么帮助解决了这个问题吗?很抱歉,我开始工作后没有进一步调查。我想当时是dll冲突。似乎移除最新的组件解决了问题。
   private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {

        String myPath = DB_PATH + DB_NAME;

        File file = new File(myPath);
        if (file.exists() && !file.isDirectory())
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
        // database does't exist yet.
    }

    if (checkDB != null) {
        checkDB.close();
    }

    return checkDB != null ? true : false;
}