【问题标题】:Sharing sqlite database between multiple Android Activities在多个 Android Activity 之间共享 sqlite 数据库
【发布时间】:2009-10-12 21:03:53
【问题描述】:

两个或多个 Android 活动可以打开一个 sqlite3 数据库进行写入吗?

我有两个活动需要将数据插入到同一个 sqlite 数据库中。当第二个 Activity 调用 SQLiteOpenHelper.getWriteableDatabase() 时,会引发 IllegalStateException,并显示消息“SQLiteDatabase created and never closed”。

我已经能够通过使我的数据库对象成为单例来避免异常,但我认为必须有更好的方法。

谢谢,

约翰

【问题讨论】:

  • 您可以在写入数据库后关闭它..
  • 我也想过这个问题,但是一个活动是使用光标适配器填充的 ListActivity。我以为关闭数据库会使适配器的重新查询失败。
  • @John:如果你使用单例数据库,你在哪里打开和关闭它?
  • 当需要时我打开数据库,做任何事情,然后关闭它。

标签: android sqlite


【解决方案1】:

一次运行的活动永远不会超过一个。解决此问题的简单方法是在启动第二个 Activity 之前让第一个 Activity 关闭它的连接。您可以在 onPause() 中执行此操作,然后在 onResume() 中重新打开它。像这样的东西(非常伪代码):

MyActivity {
    OnResume()
        open connection to database
    OnPause()
        close connection to database
}

这样,您永远不会尝试一次连接多个连接,并且连接始终可用。

【讨论】:

  • 我一直想知道这种方法是否比让活动使用相同的单例对象更好。我认为这是因为这种方法在暂停活动时使连接处于正确状态。有一个单例连接会导致有问题的清理。谢谢。
  • 是的......如果你没有在 onPause 中关闭它,那么如果(例如)你接到一个电话,连接就会悬空。
  • 这不起作用。我得到一个 InvalidStateException 和一个未能执行的 SQL 查询,甚至在调用 onResume() 之前。 Android 似乎在调用 onResume() 之前重新查询游标。
  • 我在六个应用程序中成功地使用了这种模式。如果你遇到问题,你一定是在做一些有趣的事情。提出问题并发布代码。
  • @peno:所以,你是说我解决特定问题的建议不会解决完全不同的问题?想象一下。
【解决方案2】:

我还有多个活动,每个活动都打开自己的数据库连接。当我开始其他活动时,我保持主活动处于活动状态,当我不再需要子活动时,我调用完成()。

我看到的是,子 Activity 可以成功打开连接并查询数据,而主 Activity 仍保留其 DBAdapter。当子 Activity 结束时,主 Activity 请求任何打开的游标。这似乎是自动发生的。

但是,在用户界面上单击了一段时间后,这会导致我的应用启动和完成活动,我最终会得到异常:

ERROR/Database(17657): Leak found
ERROR/Database(17657): java.lang.IllegalStateException:
      /data/data/yourpackage/databases/yourdatabase 
      SQLiteDatabase created and never closed
ERROR/Database(17657): at android.database.sqlite.SQLiteDatabase.<init>
     (SQLiteDatabase.java:1694)

异常不是来自当前处于前台的 Activity,而是来自不久前完成的 Activity。所以,垃圾收集器正在清理并找到打开的数据库连接。这不会影响应用程序 - 它会继续正常工作,并且来自前台 Activity 的所有查询都会返回数据。

解决方法就是在子Activity中关闭连接。 onDestroy() 事件是执行此操作的正确位置:

@Override    
protected void onDestroy() {        
    super.onDestroy();
    myAdapter.close();
}

由于我把它放在我所有的孩子活动中,我不再得到例外。

【讨论】:

    【解决方案3】:

    如果所有活动都扩展了这个类,我会在一个超类 AppCompatActivity 中定义数据库,或者在为所有活动继承的 Activity 类中定义它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2014-08-18
      相关资源
      最近更新 更多