【问题标题】:Android SQLiteOpenHelper cannot open database fileAndroid SQLiteOpenHelper 无法打开数据库文件
【发布时间】:2011-06-01 14:36:15
【问题描述】:

我知道之前讨论过这个主题。 但是我找不到解决问题的方法,所以我要再问一次。 我在创建数据库时遇到问题。 我已经复制了 SQLiteOpenHelper 的实现:

public class DBCreator extends SQLiteOpenHelper 
{
    private static final String DATABASE_NAME = "servision.db";
    private static final int DATABASE_VERSION = 1;


    private static final String INFO_TABLE ="create table INFO(key text,value text);";
    public static final String GATEWAYS_TABLE = "GATEWAYS";

    // Table name
    public static final String TABLE = "events";

    // Columns
    public static final String TIME = "time";
    public static final String TITLE = "title";

    public DBCreator(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        try
        {
            String gatewaytablescript ="create table" +GATEWAYS_TABLE+"(" +
            "id int primary key, " +
            "host text not null," +
            "port int not null," +
            "username text," +
            "password text,"+
            "useproxy int," +
            "proxyHost text," +
            "proxyPort port," +
            "desc text," +
            "secondaryip text," +
            "secondaryport int," +
            "timezone int," +
            "encryption int," +
            "customkey text" +
            ");";

            Log.d("DBCreator", "Creating " + GATEWAYS_TABLE + "table");
            db.execSQL(gatewaytablescript);

            String infotablescript ="create table " + INFO_TABLE + "(key text,value text);";
            Log.d("DBCreator", "Creating " + INFO_TABLE + "table");
            db.execSQL(infotablescript);

        }
        catch(SQLException ex)
        {
            Log.d("DBCreator", "onCreate exception " +ex.getMessage()); 
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
        Log.d("EventsData", "onUpgrade");
        if (oldVersion >= newVersion)
            return;


    }
}

我从主要活动 onCreate 方法创建它。

DBCreator db =new DBCreator(this);
db.getReadableDatabase();

在 logcat 中我收到以下信息:

06-01 17:31:15.523: INFO/global(2470): Default buffer size used in BufferedInputStream constructor. It would be better to be explicit if an 8k buffer is required.
06-01 17:31:15.652: INFO/Database(4160): sqlite returned: error code = 14, msg = cannot open file at source line 25467
06-01 17:31:15.652: ERROR/Database(4160): sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 6, NULL) failed
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): Couldn't open servision.db for writing (will try read-only):
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): android.database.sqlite.SQLiteException: unable to open database file
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1921)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:883)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:960)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:953)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:602)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at com.servision.svclient.Main.onCreate(Main.java:52)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.os.Looper.loop(Looper.java:123)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at java.lang.reflect.Method.invokeNative(Native Method)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at java.lang.reflect.Method.invoke(Method.java:521)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at dalvik.system.NativeStart.main(Native Method)
06-01 17:31:15.738: INFO/Database(4160): sqlite returned: error code = 14, msg = cannot open file at source line 25467
06-01 17:31:15.738: ERROR/Database(4160): sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 1, NULL) failed

永远不会调用 DBCreator 的 onCreate。 我在 Eclipse 的调试模式下在 Galaxy S 上运行程序。 我是否缺少一些权限? 可能是上下文不好还是什么?

【问题讨论】:

  • 您能否尝试从您的数据库名称中删除 *.db 文件扩展名(将 DATABASE_NAME 从 servision.db 更改为 servion)?
  • 嗨丹尼尔,感谢您的快速回答。不更改名称没有帮助。
  • 您是否手动检查了您对数据库的读/写权限?我遇到了一些奇怪的市场崩溃,报告说在极少数情况下我的应用程序无法打开数据库进行写入。我保护它以处理这种特殊情况,但我不知道任何解决方法。如果您没有读取/写入文件的权限,我认为您无能为力
  • 我通过从设备中手动删除整个应用程序文件夹解决了这个问题。
  • @AlexS 是的,我也很想知道。我不明白您删除应用程序文件夹的意思。您的意思是删除并重新创建文件夹吗?你的意思是你只是在其他地方创建了你的数据库?请展开。提前致谢!

标签: android file sqlite


【解决方案1】:

关于sqlite returned: error code = 14, msg = cannot open file at source line 25467和sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &amp;handle, 1, NULL) failed的错误,这似乎是由于没有数据库而Android试图创建一个。

这里有一些阅读

http://androidblogger.blogspot.com/2011/02/instable-android-and-unable-to-open.html

http://www.itsalif.info/content/check-if-database-exist-android-sqlite3openv2-failed

http://code.google.com/p/android/issues/detail?id=949

【讨论】:

    【解决方案2】:

    检查清单中的权限 添加

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    【讨论】:

    • 您在使用数据库时不需要外部权限,它们是您的应用程序私有的。
    【解决方案3】:

    当我收到这个错误时,我将这段代码用于我的构造函数

    public DBClass(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        context.openOrCreateDatabase(DATABASE_NAME, context.MODE_PRIVATE, null);
    }
    

    【讨论】:

      【解决方案4】:

      我的应用程序出现问题,在重新安装应用程序后将我的数据库文件更改为旧数据库时出现了该错误。 我猜问题是旧数据库文件的所有者与重新安装的应用程序的文件所有者不同。因此解决了赋予新文件完全权限 (777) 以便其他用户也可以读取它的问题。

      最后,确保您没有文件权限问题。

      【讨论】:

        【解决方案5】:

        我遇到了类似的问题,我是这样解决的:

        https://stackoverflow.com/a/22743794/1947094

        总结一下:

        adb shell
        cd /data/data/YOUR.APP.PACKAGE/databases/
        ls
        

        这会为您提供应用使用的数据库列表。

        cp your_database.db your_database.db_backup
        rm your_database.db
        

        【讨论】:

          【解决方案6】:

          此链接中已出现错误

          http://code.google.com/p/android/issues/detail?id=949

          使用下面的api...

          context.openOrCreateDatabase("sample.db", MODE_PRIVATE, null);

          试试这个链接

          http://www.itsalif.info/content/check-if-database-exist-android-sqlite3openv2-failed

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多