SQLite – 获取已排序/筛选查询的特定行索引

我正在创建一个缓存系统,使用排序/过滤的查询从SQLite数据库表中获取数据并显示它.我从中拉出的表可能非常大,当然,我需要通过在任何给定时间保留内存中的最大行数来最小化对内存的影响.通过使用LIMIT和OFFSET仅加载我需要的记录并根据需要更新缓存,可以轻松完成此操作.实现这一点很简单.我遇到的问题是确定插入到特定查询中的新记录的插入索引的位置,以便我可以适当地更新我的UI.是否有捷径可寻?到目前为止,我所拥有的想法是:

>转储整个缓存,重新计算查询结果(不保证将包含新行),刷新缓存并刷新整个UI.我希望很明显为什么这不是很理想.
>使用我自己的算法来确定新行是否包含在当前查询中,是否包含在当前缓存结果中以及当它在当前缓存范围内时应插入哪个索引.这种方法最大的缺点是它的复杂性以及我自己的排序/过滤算法与SQLite不匹配的风险.

当然,我想要的是能够问问SQLite:给定’查询A’什么是’行B’的索引,而不加载整个查询结果.但是,到目前为止,我还没有找到办法做到这一点.

我认为这不重要,但这一切都发生在iOS设备上,使用的是Objective-c编程语言.

更多信息

查询和后续缓存基于用户输入.基本上,用户可以重新排序和过滤(或搜索)以改变他们看到的结果.我在简单地重新创建插入缓存(以及编辑,实际上)时的沉默是提供“更流畅”的UI体验.

我应该指出,我现在倾向于选择“2”.我通过加载表中的所有记录并使用我自己的算法在内存中执行排序/过滤来创建自己的缓存/索引系统.确定特定记录是否和/或特定记录在缓存中的大部分代码已经存在,所以我稍微倾向于使用它.危险在于具有与基础查询不匹配的缓存.如果我在缓存中包含查询不会返回的记录,我将遇到麻烦并可能崩溃.

最佳答案 您不需要记录号码.

将有序字段的值保存在LIMITed查询结果的第一个和最后一个记录中.
然后,您可以使用这些来检查新记录是否属于此范围.

换句话说,假设您按名称字段排序,并且原始查询是这样的:

SELECT Name, ...
  FROM mytab
  WHERE some_conditions
  ORDER BY Name
  LIMIT x OFFSET y

然后尝试使用类似的查询获取新记录:

SELECT 1
  FROM mytab
  WHERE some_conditions
    AND PrimaryKey = LastInsertedValue
    AND Name BETWEEN CachedMin AND CachedMax

同样,要在插入新记录的记录之前(或之后)找出,在插入记录之后直接启动并使用限制为1,如下所示:

SELECT Name
  FROM mytab
  WHERE some_conditions
    AND Name > MyInsertedName
    AND Name BETWEEN CachedMin AND CachedMax
  ORDER BY Name
  LIMIT 1

这不会给你一个数字;您仍然需要检查返回的名称在缓存中的位置.

点赞