当我试图获得可读或可写的数据库时,我收到此错误."SQLiteCantOpenDatabaseException:未知错误(代码14)无法打开数据库"我在SQLiteOpenHelper中遇到了这个奇怪的问题,我在这里看到了一些类似问题,但是没有一个能解决我的问题.像我一样绝望,我在下面发布我的代码希望有人发现我没有看到的东西......
(一个重要的信息:我从另一个工作中得到这个应用程序.但是我调试它的非常时间,我仍然没有更改dbname.这与前一个应用程序的名称(ks.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)
这是完整的错误堆栈:
> 12-13 15:02:43.798 5764-5764/com.snitram.toriders E/SQLiteLog? (14) > cannot open file at line 31307 of [2ef4f3a5b1] 12-13 15:02:43.798 > 5764-5764/com.snitram.toriders E/SQLiteLog? (14) os_unix.c:31307: (2) > open(/storage/emulated/0tr.db) - 12-13 15:02:43.811 > 5764-5764/com.snitram.toriders E/SQLiteDatabase? Failed to open > database '/storage/emulated/0tr.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:207) > at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191) > 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:571) > at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:269) > at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) > at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) > at com.snitram.toriders.activities.LoginActivity.onCreate(LoginActivity.java:222) > at android.app.Activity.performCreate(Activity.java:6245) > at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) > at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) > at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) > at android.app.ActivityThread.-wrap11(ActivityThread.java) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) > at android.os.Handler.dispatchMessage(Handler.java:102) > at android.os.Looper.loop(Looper.java:148) > at android.app.ActivityThread.main(ActivityThread.java:5443) > at java.lang.reflect.Method.invoke(Native Method) > at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 12-13 > 15:02:43.814 5764-5764/com.snitram.toriders E/SQLiteOpenHelper? > Couldn't open /storage/emulated/0tr.db for writing (will try > read-only): > 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:207) > at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191) > 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:571) > at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:269) > at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) > at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) > at com.snitram.toriders.activities.LoginActivity.onCreate(LoginActivity.java:222) > at android.app.Activity.performCreate(Activity.java:6245) > at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) > at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) > at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) > at android.app.ActivityThread.-wrap11(ActivityThread.java) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) > at android.os.Handler.dispatchMessage(Handler.java:102) > at android.os.Looper.loop(Looper.java:148) > at android.app.ActivityThread.main(ActivityThread.java:5443) > at java.lang.reflect.Method.invoke(Native Method) > at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 12-13 > 15:02:43.815 5764-5764/com.snitram.toriders E/SQLiteLog? (14) > cannot open file at line 31307 of [2ef4f3a5b1] 12-13 15:02:43.815 > 5764-5764/com.snitram.toriders E/SQLiteLog? (14) os_unix.c:31307: (2) > open(/storage/emulated/0tr.db) - 12-13 15:02:43.816 > 5764-5764/com.snitram.toriders E/SQLiteDatabase? Failed to open > database '/storage/emulated/0tr.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:207) > at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191) > 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.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:234) > at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) > at com.snitram.toriders.activities.LoginActivity.onCreate(LoginActivity.java:222) > at android.app.Activity.performCreate(Activity.java:6245) > at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) > at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) > at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) > at android.app.ActivityThread.-wrap11(ActivityThread.java) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) > at android.os.Handler.dispatchMessage(Handler.java:102) > at android.os.Looper.loop(Looper.java:148) > at android.app.ActivityThread.main(ActivityThread.java:5443) > at java.lang.reflect.Method.invoke(Native Method) > at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 12-13 > 15:02:43.816 5764-5764/com.snitram.toriders D/AndroidRuntime? > Shutting down VM 12-13 15:02:43.817 5764-5764/com.snitram.toriders > E/AndroidRuntime? FATAL EXCEPTION: main > Process: com.snitram.toriders, PID: 5764 > java.lang.RuntimeException: Unable to start activity ComponentInfo{com.snitram.toriders/com.snitram.toriders.activities.LoginActivity}: > android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error > (code 14): Could not open database > at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) > at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) > at android.app.ActivityThread.-wrap11(ActivityThread.java) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) > at android.os.Handler.dispatchMessage(Handler.java:102) > at android.os.Looper.loop(Looper.java:148) > at android.app.ActivityThread.main(ActivityThread.java:5443) > at java.lang.reflect.Method.invoke(Native Method) > at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) > Caused by: 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:207) > at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191) > 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.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:234) > at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187) > at com.snitram.toriders.activities.LoginActivity.onCreate(LoginActivity.java:222) > at android.app.Activity.performCreate(Activity.java:6245) > at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) > at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) > at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) > at android.app.ActivityThread.-wrap11(ActivityThread.java) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) > at android.os.Handler.dispatchMessage(Handler.java:102) > at android.os.Looper.loop(Looper.java:148) > at android.app.ActivityThread.main(ActivityThread.java:5443) > at java.lang.reflect.Method.invoke(Native Method) > at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Amit.. 8
您正在使用SQLiteDatabase.openDatabase
可能不存在的文件路径.在SQLiteDatabase.openDatabase
通话之前添加2行以下
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; }
Totalys.. 6
在将targetSdkVersion从23 更改为22 后,错误停止显示.此降级强制卸载设备上的软件包,并且重新安装它时工作正常.谢谢 Frank N. Stein的帮助!
您正在使用SQLiteDatabase.openDatabase
可能不存在的文件路径.在SQLiteDatabase.openDatabase
通话之前添加2行以下
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; }
在将targetSdkVersion从23 更改为22 后,错误停止显示.此降级强制卸载设备上的软件包,并且重新安装它时工作正常.谢谢 Frank N. Stein的帮助!