2012-04-09 117 views
0

我有一个应用程序与sqlite数据库。android sqlite数据库已关闭错误

我创建了我自己的数据库类,它包含一个SqliteDatabase实例。该类实现我的查询,打开,关闭等(该类不是单身人士)。

我在我的应用程序中有一个活动,一个服务和一个appwidget。

在我需要数据库的地方,我创建了我的类的一个对象,打开,做些东西,最后关闭。

例如在活动中,我在onStart中打开数据库并关闭onStop。

除了appwidget,一切都很好。

如果我需要选择appwidget onUpdate中的数据,那就没问题。

但是当我尝试从appwidget执行更新时,出现“数据库DATABASE_FLE已关闭”错误。

它可能是什么?

我添加了一些日志,我关闭数据库,并且这些行的非执行之前执行此错误..数据库应该没问题。

任何想法?

谢谢。

回答

0

问题是我编译了一个SQLiteStatment对象并将其保存以备将来使用,同时我的数据库对象被替换了。 所以SQLiteStatement需要重新编译一次。

我有这样的事情:

public void func(SQLiteDatabase db) { 
    if (mStatement == null) 
     mStatement = db.compileStatement(SQL); 

    mStatement.execute(); 

这样做的问题是,db对象在函数调用改变,而且编译声明已经关闭的第一个数据库对象。

解决方法是删除if-null,并为每个db对象编译语句。

+0

我相信它对于解决您的问题非常重要(以防之前没有人这样做),因为其他开发人员可以从中学习。 – Jviaches 2012-04-10 07:36:42

0

我在想什么,在这种情况下,android可能会关闭/卸载您的活动(例如,如果设备上留有少量内存,可能会发生这种情况),但是在这段时间内,您的appwidget仍处于活动状态。

现在,由于您的活动已关闭,因此您的db已关闭。 Appwidget尝试更新数据库,但其已关闭。

检查这种情况,但无论如何,你应该考虑这种情况。 :)

+0

在appwidget onUpdate中,我创建了一个新的数据库对象并打开数据库.. SELECT的工作原理..当我尝试更新时(实际上当我调用一个sql语句对象上的绑定)时,我得到错误 – Ran 2012-04-09 17:56:52