我经常收到有此错误的用户的报告。
无法getWritableDatabase.
try {
//dbOpenHelper is a standard SQLiteOpenHelper
dbOpenHelper.getWritableDatabase();
} catch (Exception e) {
//unable to connect to database.
return;
}这只是偶尔发生的事。会是什么?有什么解决办法吗?
发布于 2012-10-19 20:17:05
没有什么可做的,需要看到您的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输出,这可能是您最感兴趣的。)
在我看来,拥有DB的活动正被正确的close()访问和处理得很好,但在某些情况下,用户可能不是通过该活动运行,而是按后退按钮,其中onBackPressed()可能应该有一个DB close()调用?
换句话说,为了排除故障,我将使用@Override活动生命周期方法:onPause()、onResume()、onStart()、onStop()和onDestroy(),以及onBackPressed(),只需添加DB close(),然后测试应用程序。如果这样做,我认为任何返回的生命周期(如onStart()或onResume() )都应该包含DB getWritableDatabase()。
根据文档(参见下面的文档),除非数据库未正确关闭,否则无法获得Unable to getWritableDatabase。还要确保如果您更改了SQlite代码/结构中任何需要更新DB版本#的内容。
public SQLiteDatabase getWritableDatabase () 创建和/或打开将用于读写的数据库。第一次调用时,将打开数据库,调用onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase、int、int)和/或onOpen(SQLiteDatabase)。 一旦成功打开,数据库就会被缓存,所以每次需要写入数据库时都可以调用此方法。(当您不再需要数据库时,请确保调用close()。)错误,如错误的权限或完整的磁盘可能导致此方法失败,但如果问题得到解决,以后的尝试可能会成功。
编辑2
我应该第一次展示如何调用open()和close()方法。真对不起。您不需要打开DatabaseHelper,除非您正在检索或投递到它,因此在处理之后立即关闭它,直到下次需要它为止。Cursor等也是如此
下面是我如何查询数据库,我打开一切,检索信息,处理信息,然后立即关闭一切。见下文:
DatabaseControl control = new DatabaseControl(this);
try {
database = (new DatabaseHelper(this)).getWritableDatabase();
DatabaseControl control = new DatabaseControl(DbTestDisplay.this);
control.open();
control.fetchAllItems();
Cursor c = database.query(GlobalDBVars.TABLE_NAME, null, null, null, null, null, null, null);
c.moveToFirst();
int initialCount = c.getCount();
Log.i("cursor", "Initial Count = " + initialCount);
List<Integer> x = new ArrayList<Integer>();
if (initialCount > 0) {
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
/* Process everything here */
} /* End for loop */
} /* End if statement */
control.close();
c.close();
database.close();
} catch (SQLException sqe) {
Log.e("fetchAllItems", "FAILED: " + sqe.getMessage() + " allData = ");
}发布于 2012-10-25 20:11:17
尝试getReadableDatabase()而不是getWritableDatabase()
try {
//dbOpenHelper is a standard SQLiteOpenHelper
dbOpenHelper.getReadableDatabase();
} catch (Exception e) {
//unable to connect to database.
return;
}https://stackoverflow.com/questions/12981691
复制相似问题