1

我有一项在设备连接到互联网时运行的服务。它从 sqlite 获取数据,然后将其上传到服务器上。已使用数据库中的数据填充列表片段。

由于我有服务,我收到诸如“数据库已关闭”“数据库未打开”之类的错误。我的 dbHelper 对象是静态的。我SQLiteDatabase db = this.getWritableDatabase();在每个将访问数据库的方法开始时调用。db.close() 在每个方法的末尾。

我应该关闭db.close()唯一的onDestroy()吗?...这会解决问题还是有其他方法?

4

2 回答 2

1

首先,如果你想关闭一个数据库,你必须检查它是否是isOpen().

现在,一般来说,您的SQLiteOpenHelper实现应该是一个单例并将close()方法重写为:

@Override
public synchronized void close() {
    mOpenConnections--;
    if (mOpenConnections == 0) {
        super.close();
    }

}

wheremOpenConnections是一个成员,它保存通过SQLiteOpenHelper. 每次有人打开数据库时,该成员都应该增加。

@Override
public synchronized void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    // increment the number of users of the database connection.
    mOpenConnections++;
}

然后当你需要关闭一个数据库时使用SQLiteOpenHelper.close()方法。

这应该可以解决您的所有问题。

于 2013-01-20T09:43:45.397 回答
0

我发现在多个活动中可靠工作的唯一解决方案是在每个活动的 onCreate 方法中调用 getWritableDatabase。

正如已经指出的,任何服务都应该有自己的 SQLiteOpenHelper 实例。我认为无论如何都会发生这种情况,因为服务在单独的地址空间中运行,但最好确保。

于 2013-01-18T10:04:12.217 回答