2010-06-13 105 views
0

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视图上调用无效,这几乎包含了所有内容。我认为这些观点会重新绘制和刷新其基础数据,但这也没有预期的结果。

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

+0

也许你必须重新查询你的游标和/或notifiydataset的变化。 – Pentium10 2010-06-13 19:29:44

回答

1

至少在概念上同意Pentium10。

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

现在,处理数据库内容变化的正常方式是在Cursor上调用requery()。这将通过CursorAdapter连接ListViews或其他AdapterViews波及其变化。

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

+0

这似乎是不切实际的,因为我有一个TabHost具有多个标签,每个标签都有自己的光标打开。我甚至不知道如何通知每个Tab的光标来执行一个请求()。实际上似乎发生的事情是游标在检测到更改时会刷新自己。例如,当我向一个ListView发起一个事件,导致尝试更新数据库中不再存在的行时,游标将刷新,并且ListView显示正确的数据。我并不是说这就是我希望它的行为,我只是将其作为一种观察。 – cdonner 2010-06-14 00:04:58

+0

@cdonner:“实际上似乎发生的事情是游标在检测到变化时会刷新自己。”如果他们是托管游标,那是非常可能的。他们很乐意将他们的数据库从他们下面剥离出来。也许你只能在应用程序启动的时候才能恢复你的数据库,或者在你知道你没有打开数据库连接的时候。 – CommonsWare 2010-06-14 00:18:10

+0

当然,等待用户对数据做些什么,然后向他展示其他东西是不可接受的。我会让我的代码完成活动并重新启动它,因为它确保所有内容都能够正确地重新初始化。 – cdonner 2010-06-14 01:27:28