我经常会收到有此错误的用户报告。
无法getWritableDatabase。
try {
//dbOpenHelper is a standard SQLiteOpenHelper
dbOpenHelper.getWritableDatabase();
} catch (Exception e) {
//unable to connect to database.
return;
}
这有时只会发生。会是什么呢?任何修复或解决方法?
答案 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()
能力生命周期方法:@Override
,onPause()
,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;
}