异步任务和Sqlite

时间:2013-01-18 07:45:49

标签: android android-service android-sqlite

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

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

我应该只在db.close()关闭onDestroy()吗? ......这会解决问题还是有另一种方式?

2 个答案:

答案 0 :(得分:1)

首先,如果您想要关闭数据库,则必须检查它是否为isOpen()

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

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

}

其中mOpenConnections是一个成员,其中包含通过SQLiteOpenHelper建立的连接数。每当有人打开数据库时,该成员应该递增。

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

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

这可以解决你所有的问题。

答案 1 :(得分:0)

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

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