首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法实现getWritableDatabase() --有时

无法实现getWritableDatabase() --有时
EN

Stack Overflow用户
提问于 2012-10-19 20:05:20
回答 2查看 3.6K关注 0票数 2

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

无法getWritableDatabase.

代码语言:javascript
复制
try {
        //dbOpenHelper is a standard SQLiteOpenHelper
        dbOpenHelper.getWritableDatabase();             
} catch (Exception e) {
        //unable to connect to database.
        return;
}

这只是偶尔发生的事。会是什么?有什么解决办法吗?

EN

回答 2

Stack Overflow用户

发布于 2012-10-19 20:17:05

没有什么可做的,需要看到您的LogCat来提供更多帮助。你要关闭你的dbOpenHelper吗?

下面是一个简单的例子:

代码语言:javascript
复制
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等也是如此

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

代码语言:javascript
复制
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 = ");
}
票数 0
EN

Stack Overflow用户

发布于 2012-10-25 20:11:17

尝试getReadableDatabase()而不是getWritableDatabase()

代码语言:javascript
复制
try {
        //dbOpenHelper is a standard SQLiteOpenHelper
        dbOpenHelper.getReadableDatabase();           
} catch (Exception e) {
        //unable to connect to database.
        return;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12981691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档