【问题标题】:Resetting or refreshing a database connection重置或刷新数据库连接
【发布时间】:2010-06-13 18:54:16
【问题描述】:

This Android application on Google用备份替换数据库文件后,使用如下方法刷新数据库:

public void resetDbConnection() { 
    this.cleanup(); 
    this.db = 
        SQLiteDatabase.openDatabase(
           "/data/data/com.totsp.bookworm/databases/bookworm.db",
            null, SQLiteDatabase.OPEN_READWRITE); 
} 

我没有构建这个应用程序,我不确定会发生什么。 我试图让这个想法在我自己的应用程序中发挥作用,但数据似乎被视图缓存,并且应用程序继续显示来自被替换的数据库的数据,即使在我调用 cleanup() 并重新打开数据库之后也是如此。我必须终止并重新启动活动才能看到新数据。

我尝试在我的 TabHost 视图上调用 invalidate,它几乎包含了所有内容。我认为视图会重绘并刷新其基础数据,但这也没有达到预期的结果。

我最终以编程方式重新启动了活动,这很有效,但这似乎是一个激进的措施。有没有更好的办法?

【问题讨论】:

  • 可能你必须重新查询你的游标和/或通知数据集的变化。

标签: android sqlite database-connection


【解决方案1】:

至少在概念上同意 Pentium10。

应用程序正在使用Cursor 来显示其数据。 Android 中的Cursor 类似于 ODBC 中的客户端游标,因为它是由查询结果集表示的所有数据的缓存副本。

现在,处理数据库内容更改的正常方法是在Cursor 上调用requery()。这将通过CursorAdapter 将其更改波及到附加的ListViews 或其他AdapterViews

在您的情况下,我不完全确定这会起作用,因为您正在关闭、替换和重新打开数据库。这不应该通过在数据上打开 Cursor 来完成,AFAIK。因此,在您的情况下,您需要关闭 Cursor,进行数据库洗牌,然后再次运行查询以在新数据库上获得新的 Cursor

【讨论】:

  • 这似乎不切实际,因为我有一个带有多个选项卡的 TabHost,每个选项卡都有自己的光标打开。我什至不确定如何通知每个 Tab 的光标执行 requery()。实际上似乎发生的是游标在检测到更改时会自行刷新。例如,当我向我的一个 ListView 发起一个事件,导致尝试更新数据库中不再存在的行时,游标会刷新并且 ListView 会显示正确的数据。我并不是说这就是我希望它的行为方式,我只是将其作为观察提及。
  • @cdonner:“实际上似乎发生的是游标在检测到更改时会自行刷新。”如果它们是托管游标,那是极有可能的。他们仍然不太可能会喜欢从他们下面撕掉他们的数据库。也许您只能在应用程序启动时恢复您的数据库,或者在您知道没有打开的数据库连接的其他时间。
  • 等待用户对数据做某事然后向他展示其他东西当然是不可接受的。我将保留完成活动并重新启动它的代码,因为它确保一切都正确重新初始化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2011-03-26
  • 1970-01-01
  • 2017-07-19
相关资源
最近更新 更多