【问题标题】:How do i replace the currently open FMDB database retaining the current queue?如何替换当前打开的保留当前队列的 FMDB 数据库?
【发布时间】:2012-12-12 00:35:44
【问题描述】:

我有一个关于将数据存储在 SQLite 中的应用程序的问题。使用 FMDB 包装器读取数据,如果服务器端数据库发生更改,则必须对用户透明地进行更新。

为了实现这一点,每当下载新数据库时,我都会将我的单例中的整个 FMDatabase 对象替换为一个新对象。

但是,如果用户当前正在滚动表格视图,则查询会在瞬间失败。

那么问题来了,如何在保留当前队列的同时替换当前打开的.sqlite文件?

编辑:查询经常针对数据库运行,例如在滚动视图时有 count()s,因此没有简单的方法可以暂时“阻止”用户与数据库交互。

【问题讨论】:

  • 你在使用FMDatabaseQueue吗?还是您自己管理队列?

标签: iphone objective-c ios sqlite fmdb


【解决方案1】:

可以在数据库更新的那一瞬间添加UIActivityIndicatorView 吗?您可以在传输开始时将其打开,并在回调时将其关闭。

【讨论】:

  • 并非如此——因为在滑动后 tableview 正在减速时可能会发生变化。卸载数据库时出现的行将有空白的详细信息文本,因为只有在行出现时才会获取。
  • 任意组合,它是一个考试题数据库,它可以在很多方面发生变化。
  • 那么情况就有点复杂了,不如我们监听减速结束,在用户滑动之后,因为那样用户只能看到当前数据库中的内容,然后在用户之前更新可以再刷一次吗?
【解决方案2】:

在我看来,您会将 SQLite 数据库中的数据源存储在数组或其他集合中,对吧?

因此,每当您完成从服务器下载更新的数据库时,请发布“DatabaseUpdated”通知。 (此代码应该在您的共享单例中)。

并且,让你的视图控制器成为这个通知的观察者。

收到此通知后,只需在您的视图控制器中调用 [tableView reloadData];

因此,实际上,您的视图将根据您的新数据库更改进行更新。

【讨论】:

  • 虽然这是个好主意,但在我的情况下这是不可行的,因为每个单元格的详细信息行都会执行 count(),我只想在行可见时执行。我不想在显示列表之前执行数千个可能不必要的 count()(以缓存来自 sqlite 的数据)。这会破坏数据库的目的。
  • 我不知道您的案例中使用的count()。所以,这还不够。
猜你喜欢
  • 2019-07-10
  • 1970-01-01
  • 2021-01-04
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
相关资源
最近更新 更多