我有一项服务,当设备连接到互联网时运行。它从sqlite中获取数据,然后将其上载到服务器上。已使用数据库中的数据填充了listfragment。
由于我有服务,我收到的错误如“数据库已关闭”“数据库未打开”。
我的dbHelper对象是静态的。
我在每个将访问数据库的方法的开头调用SQLiteDatabase db = this.getWritableDatabase();
。并且db.close()在每个方法的末尾。
我应该只在db.close()
关闭onDestroy()
吗? ......这会解决问题还是有另一种方式?
答案 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实例。我认为无论如何都会发生这种情况,因为服务在一个单独的地址空间中运行,但最好确保。