将CoreData拆分为更快的查询时间

我在地图上有一个巨大的经纬度核心数据库。

我有一个对象称为一个有序的节点(lon,lat)组成的一种方式。 我还在附近存放封闭的盒子(minLon,minLat,maxLon,maxLat …)。

数据模型

我的查询查找地图的特定区域中的所有方法:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"minLon < %f AND maxLon > %f AND minLat < %f AND maxLat > %f", maxLon, minLon, maxLat, minLat]; 

它的大坝很慢!

我的想法是加速查询是以正方形区域以某种方式拆分数据(多个表?多个.sqllite文件?创build一个位置的散列?),所以有更less的数据要search。

我怎样才能做到这一点?

  1. 您可以通过将您的Way实体中的最小/最大值存储为缩放整数而不是浮点数来加速查询。 select一个比例因子,给出一个可接受的区域分辨率,当您存储它们时使用它进行预分级,并在查询时使用相同的比例因子。

  2. 您也可以考虑在您的核心数据模型中添加一个四叉树数据结构,以便在所需区域的方法中进行操作。

  3. SQlite将在复合谓词中的第一个testing失败时释放出来,所以首先应该使用最便宜的testing。

  4. 也看看为这4个属性启用索引。

说实话,我很惊讶,这是缓慢的。 您在数据库中总共有多less种方法,以及您想要查询的区域中有多less种?

你有没有试过打开SQLdebugging来查看实际上针对数据库运行的查询? (提示:添加-com.apple.CoreData.SQLDebug 1作为运行行为的Scheme编辑器中的命令行参数)