SQLite – 获取已排序/筛选查询的特定行索引
我正在创建一个缓存系统,使用排序/过滤的查询从SQLite数据库表中获取数据并显示它.我从中拉出的表可能非常大,当然,我需要通过在任何给定时间保留内存中的最大行数来最小化对内存的影响.通过使用LIMIT和OFFSET仅加载我需要的记录并根据需要更新缓存,可以轻松完成此操作.实现这一点很简单.我遇到的问题是确定插入到特定查询中的新记录的插入索引的位置,以便我可以适当地更新我的UI.是否有捷径可寻?到目前为止,我所拥有的想法是:
>转储整个缓存,重新计算查询结果(不保证将包含新行),刷新缓存并刷新整个UI.我希望很明显为什么这不是很理想. 当然,我想要的是能够问问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 这不会给你一个数字;您仍然需要检查返回的名称在缓存中的位置. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |