我有一个带有sqlite数据库的应用程序。
我创建了自己的数据库类,其中包含一个SqliteDatabase实例。该类实现我的查询,打开,关闭等(该类不是单例)。
我的应用中有活动,服务和appwidget。
在我需要数据库的地方,我创建了一个我的类的对象,打开,做东西并在最后关闭。
例如在活动中我在onStart中打开数据库并在onStop上关闭它。
除了在appwidget中,一切都很好。
如果我需要在appUidget onUpdate中选择数据,那就没关系。
但是当我尝试从appwidget执行UPDATE时,我得到“数据库DATABASE_FLE已经关闭”错误。
它有什么用?
我添加了一些日志,我正在关闭数据库,并且在这个错误之前没有这些行执行..数据库应该没问题。
有什么想法吗?
感谢。
答案 0 :(得分:0)
我正在考虑的是,android可以关闭/卸载您的活动(例如,如果设备上剩下一点内存,可能会发生这种情况),但此时您的appwidget仍处于活动状态。
现在,由于您的活动已关闭,因此您的数据库已关闭。 Appwidget试图更新数据库,但它已经关闭。
检查此方案,但无论如何您应该考虑这种情况。 :)
答案 1 :(得分:0)
问题是我编译了一个SQLiteStatment对象并将其保存以备将来使用,而我的数据库对象被替换了。 所以SQLiteStatement需要重新编译。
我有这样的事情:
public void func(SQLiteDatabase db) {
if (mStatement == null)
mStatement = db.compileStatement(SQL);
mStatement.execute();
这个问题是在函数调用中更改了db对象,并且已经关闭了编译语句的第一个db对象。
解决方案是删除if-null,并为每个db对象编译语句。