SQLite打开或创建数据库时出现未知错误(代码14):无法打开数据库。

3

我正在尝试学习安卓中的SQLite。

我创建了一个Helper类,它应该打开我的数据库并执行所有Helper类所需的操作。

我的问题是,由于以下错误,我甚至无法打开数据库:

android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database

这是我的DatabaseHelper类相关代码,错误出现在openOrCreateDatabase行:

public class DatabaseHelper<T> implements IDatabaseHelper{
private static final String DATABASE_NAME = "myDatabase.db";
private static String DATABASE_PATH = "";
private static final int DATABASE_VERSION = 1;
private static SQLiteDatabase database;
private static Context ctx;

//constructor
public DatabaseHelper(Context context){
    ctx = context;
    DATABASE_PATH = ctx.getFilesDir().getPath();
}

//apertura database
public boolean OpenDB() {
    //try{
    database = SQLiteDatabase.openOrCreateDatabase(DATABASE_NAME, null, null);
    return true;
    }

虽然代码被try catch包围,但问题仍然是它无法打开我的数据库。以下是堆栈跟踪信息:

11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase: Failed to open database 'myDatabase.db'.
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at 
android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:717)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at personal.pier.weightwatcher.Utils.DatabaseHelper.OpenDB(DatabaseHelper.java:85)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at personal.pier.weightwatcher.Activities.SplashScreenActivity.onCreate(SplashScreenActivity.java:22)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.app.Activity.performCreate(Activity.java:5990)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.app.ActivityThread.access$900(ActivityThread.java:154)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.os.Handler.dispatchMessage(Handler.java:102)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.os.Looper.loop(Looper.java:135)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at android.app.ActivityThread.main(ActivityThread.java:5292)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at java.lang.reflect.Method.invoke(Native Method)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at java.lang.reflect.Method.invoke(Method.java:372)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
11-05 17:27:35.410 16641-16641/? E/SQLiteDatabase:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
11-05 17:27:35.410 16641-16641/? D/AndroidRuntime: Shutting down VM
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime: FATAL EXCEPTION: main
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime: Process: personal.pier.weightwatcher, PID: 16641
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{personal.pier.weightwatcher/personal.pier.weightwatcher.Activities.SplashScreenActivity}: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2358)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread.access$900(ActivityThread.java:154)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5292)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:  Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:717)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at personal.pier.weightwatcher.Utils.DatabaseHelper.OpenDB(DatabaseHelper.java:85)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at personal.pier.weightwatcher.Activities.SplashScreenActivity.onCreate(SplashScreenActivity.java:22)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5990)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:242011-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread.access$900(ActivityThread.java:15411-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:132111-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:10211-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:13511-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:529211-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
11-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:37211-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:90411-05 17:27:35.411 16641-16641/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699

我实在找不到解决方案。任何帮助都将不胜感激。谢谢提前。

顺便说一下:我没有故意扩展SQLiteOpenHelper,因为我想对操作有更多的控制权,因为我正在尝试只使用一个helper来处理所有的类。


1
在您的文件系统中提供完整路径 - pskink
@pskink 谢谢回复,我该怎么做呢?getfilesdir().getpath() 不够吗? - Pier Giorgio Misley
你正在调用openOrCreateDatabase,其中DATABASE_NAME仅为"myDatabase.db",而不是类似于"/full/path/to/my/database.db"这样的东西。 - pskink
@pskink 我正在睡觉..浪费了一个小时,因为我以为已经在做路径+数据库名了..非常感谢你,你救了我的一天!如果你回复的话,我会将其设置为正确答案 :) - Pier Giorgio Misley
更多的咖啡,伙计,更多的咖啡... - pskink
@pskink 哈哈哈哈,是的,需要它! - Pier Giorgio Misley
2个回答

4

在调用SQLiteDatabase.openOrCreateDatabase方法时,第一个参数(String path)应该是文件系统的完整路径,可以通过getFilesDir()或类似的调用来创建它。


0

在 DatabaseHelper 构造函数中,你应该调用 super。

//constructor
public DatabaseHelper(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    ctx = context;
    DATABASE_PATH = ctx.getFilesDir().getPath();
}

谢谢快速回复,我在这里遇到了错误,我需要在我的类中添加一些东西才能使用super吗?我收到了“Object()在对象中无法应用”的错误。 - Pier Giorgio Misley
我想你应该扩展SQLiteOpenHelper,参见这个例子:链接 - Alisson
不,我在结尾处写了“PS”,我不想扩展SQLiteOpenHelper,因为我想使用一个帮助类来处理所有实体,所以我需要更多的控制。@pskink的评论解决了这个问题,当我编写代码时我显然是在睡觉。无论如何,还是谢谢你的回答! :) - Pier Giorgio Misley
糟糕,抱歉!我的错 :) - Alisson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接