我有一个包含大量日志消息的 SQLite 数据库。
我想在列表视图中显示它(使用 wxWidgets)。
用户可以重新排序列表(通过按下列标题),对结果集应用过滤器,并使用滚动条像通常的列表一样浏览它。用户还可以选择列表中的一个或多个条目并删除它们。
我有一个虚拟列表模型:列表视图向模型询问特定行的内容。该模型使用当前过滤条件和顺序发出选择查询,并从结果中返回相应的行。
为了让它更快,我保留了结果的页面缓存:当请求一行时,我使用 LIMIT 和 OFFSET 获取整个页面(约 100 行)并从页面返回特定行。我存储了许多页面,下次请求一行时,我首先查看它是否在其中一个缓存页面中可用。事实证明,即使有很多条目(50k+),这种技术也能快速响应。
问题
我的问题是如何处理更新/插入/删除。我每个都有一个触发器,因此每当发生插入/更新/删除时都会通知模型。触发器还告诉模型受影响条目的 ID(主键)。
我的第一个版本只是在每次触发后对模型进行了完全重置。这不是很快,但足够快。问题是,如果用户选择了一行或几行,选择就会丢失。
模型的基类 (wxDataViewVirtualListModel) 包含在发生更改时应调用的方法:
- RowInserted(行)
- 行已删除(行)
- RowChanged(行)
如果我使用它们,选择问题将得到解决,但是存在问题:
- 我如何知道更改的行是否在当前过滤集中?
- 我如何知道列表视图中的哪一行受到了影响?
第一个问题可以通过创建一个检查条目是否属于集合的方法来解决。它的行为必须与 SQL 条件完全相同,但它是可行的。
第二个问题我根本不知道如何解决。
我使用了一个虚假的(0 或最后一行)行号来强制更新视图,但问题是如果在选择之前插入/删除了行,则选择之后指向错误的行,等等。
你会怎么做?在内存中保留包含所有条目的高级数据结构?
这个问题与另一个问题有关: 显示大结果集