2012-12-26 29 views
2

我有一个关于在SQLite中存储数据的应用程序的问题。使用FMDB包装器读取数据,并且必须在服务器端数据库更改时透明地更新给用户。如何替换当前打开的FMDB数据库保留当前队列?

为了实现这个目标,每当下载一个新的数据库时,我将用一个新的对象代替我的单例中的整个FMDatabase对象。

但是,对于一瞬间查询将失败,例如,如果用户当前正在滚动表视图。

所以问题是,如何在保留当前队列的同时替换当前打开的.sqlite文件?

编辑:查询是经常对数据库运行的,例如当滚动视图时有count()s,所以没有简单的方法来阻止用户与数据库交互一段时间。

+0

您是否在使用'FMDatabaseQueue'?还是你自己管理队列? –

回答

1

在数据库更新期间,在这段时间内添加UIActivityIndicatorView是否可以?您可以在传输开始时打开它,并在回调中将其关闭。

+0

不是真的 - 因为改变可能发生,比如说一个tableview在滑动后减速。数据库卸载时出现的行将具有空白的细节文本,因为只有在该行出现时才会获取该文本。 –

+0

此数据库更新是要添加,删除还是插入行? – MichaelScaria

+0

任何组合,它的考试问题数据库,它可以在很多方面改变。 –

1

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

因此,每当您完成从服务器下载更新的数据库时,发布通知“DatabaseUpdated”。 (这段代码应该在你的Shared Singleton中)。

然后,让您的视图控制器成为此通知的观察者。

收到此通知后,请在您的视图控制器中拨打[tableView reloadData];

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

+0

虽然这是一个好主意,但在我的情况下它不可行,因为每个单元格的详细信息行都会执行count(),我只希望在该行可见时执行该操作。我不想在显示列表之前进行数千次可能不必要的count()操作(以缓存来自sqlite的数据)。这会破坏数据库的目的。 –

+0

我不知道在你的情况下正在使用的count()。所以,这是不够的。 –

+0

对不起,更新的问题。 –