我正在创建一个缓存系统,以使用排序/过滤查询从 SQLite 数据库表中获取数据并显示它。我从中提取的表可能非常大,当然,我需要通过在任何给定时间仅保留内存中的最大行数来最大限度地减少对内存的影响。这很容易通过使用LIMIT
并OFFSET
仅加载我需要的记录并根据需要更新缓存来完成。实现这一点是微不足道的。我遇到的问题是确定插入到特定查询中的新记录的插入索引在哪里,以便我可以适当地更新我的 UI。是否有捷径可寻?到目前为止,我的想法是:
- 转储整个缓存,重新计算查询结果(不保证会包含新行),刷新缓存并刷新整个 UI。我希望很明显为什么这不是真正可取的。
- 使用我自己的算法来确定新行是否包含在当前查询中,是否包含在当前缓存结果中,以及如果它在当前缓存范围内,则应将其插入到哪个索引中。这种方法最大的缺点是它的复杂性和我自己的排序/过滤算法与 SQLite 不匹配的风险。
当然,我想要的是能够询问 SQLite:Given 'Query A' 'Row B' 的索引是什么,而不需要加载整个查询结果。但是,到目前为止,我还没有找到一种方法来做到这一点。
我认为这并不重要,但这一切都发生在 iOS 设备上,使用的是 Objective-C 编程语言。
更多信息
查询和后续缓存基于用户输入。本质上,用户可以重新排序和过滤(或搜索)以改变他们看到的结果。我对简单地重新创建插入(实际上是编辑)缓存的沉默是为了提供“更流畅”的 UI 体验。
我应该指出,我目前倾向于选项“2”。我通过将所有记录加载到表中并使用我自己的算法在内存中执行排序/过滤来创建自己的缓存/索引系统。确定特定记录是否和/或在缓存中的位置所需的大量代码已经存在,所以我有点倾向于使用它。危险在于缓存与底层查询不匹配。如果我在缓存中包含一条查询不会返回的记录,我就会遇到麻烦并且可能会崩溃。