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