无法getWritableDatabase() - 有时候

时间:2012-10-19 20:05:21

标签: android database sqlite

我经常会收到有此错误的用户报告。

无法getWritableDatabase。

try {
        //dbOpenHelper is a standard SQLiteOpenHelper
        dbOpenHelper.getWritableDatabase();             
} catch (Exception e) {
        //unable to connect to database.
        return;
}

这有时只会发生。会是什么呢?任何修复或解决方法?

2 个答案:

答案 0 :(得分:0)

没有什么可以去的,需要看到你的LogCat来帮助你。你在关闭dbOpenHelper吗?

这是一个简单的例子:

public DatabaseControl open() throws SQLiteException {
    dbHelper = new DatabaseHelper(context);
    database = dbHelper.getWritableDatabase();
    return this;
}

public void close() {
    dbHelper.close();
}

编辑1 - 再次,这是我最好的猜测,因为LogCat无法获得。 (最后,在您的Dev设备上运行此应用程序并尝试复制然后获取完整的LogCat输出可能符合您的最佳利益)

听起来像是正在使用正确的close()来访问和处理数据库的活动,但在某些情况下,用户可能不会通过该活动按下后退按钮{{1也许应该有一个DB onBackPressed()来电?

换句话说,要进行问题排查,我会close()能力生命周期方法:@OverrideonPause()onResume()onStart()和{{1} }以及onStop()只需添加数据库onDestroy()然后测试您的应用程序。如果您这样做,我认为,任何返回的生命周期,例如onBackPressed()close()都应该包含数据库onStart()

根据文档(见下文),除非数据库未正确关闭,否则无法获得onResume()。还要确保如果您更改了SQlite代码/结构中需要更新数据库版本号的任何内容。

  

public SQLiteDatabase getWritableDatabase()

     
    

创建和/或打开将用于读写的数据库。第一次调用它时,将打开数据库并调用onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和/或onOpen(SQLiteDatabase)。

         

成功打开后,数据库将被缓存,因此您可以在每次需要写入数据库时​​调用此方法。 (确保在不再需要数据库时调用close()。)错误权限或完整磁盘等错误可能导致此方法失败,但如果问题得到解决,将来的尝试可能会成功。

  

修改2

我应该首次展示我如何调用getWritableDatabase()Unable to getWritableDatabase方法。对于那个很抱歉。您不需要open()打开,除非您正在检索或发布它,因此在处理完之后立即关闭它直到您下次需要它。同样适用于close()

下面是我如何查询数据库,我打开所有内容,检索信息,处理信息,然后立即关闭所有内容。见下文:

DatabaseHelper

答案 1 :(得分:0)

尝试getReadableDatabase()而不是getWritableDatabase()

try {
        //dbOpenHelper is a standard SQLiteOpenHelper
        dbOpenHelper.getReadableDatabase();           
} catch (Exception e) {
        //unable to connect to database.
        return;
}