iphone - 拆分 CoreData 以获得更快的查询时间

标签 iphone sql ios sqlite core-data

我有一个 巨大的 map 上路径的经纬度核心数据库。

我有一个称为方式的对象,它由一组有序的节点(lon,lat)组成。我还在途中存储了封闭框(minLon,minLat,maxLon,maxLat ...)。

Data Model

我的查询找到了 map 特定区域的所有方式:

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

它的大坝慢!

我加快查询速度的想法是以某种方式将数据按正方形区域拆分(多个表?多个 .sqllite 文件?创建位置的哈希?),因此要搜索的数据更少。

我怎样才能做到这一点?

最佳答案

  • 您可以通过将 Way 实体中的最小值/最大值存储为缩放整数而不是浮点数来加快查询速度。选择一个为您提供可接受的区域分辨率的比例因子,在您存储它们时使用它来预缩放值,并在您进行查询时使用相同的比例因子。
  • 您还可以查看添加 quadtree数据结构到您的核心数据模型,以便在所需区域的 Ways 上进行定位。
  • SQlite 将在复合谓词中失败的第一个测试中退出,因此首先将最便宜的测试放在首位。
  • 另请查看为这 4 个属性启用索引。

  • 老实说,我很惊讶这很慢。您的数据库中总共有多少条 Ways 以及您想要查询的区域中通常有多少条?

    您是否尝试过打开 SQL 调试以查看实际对数据库运行的查询? (提示:添加 -com.apple.CoreData.SQLDebug 1 作为运行行为的方案编辑器中的命令行参数)

    关于iphone - 拆分 CoreData 以获得更快的查询时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7908851/

    相关文章:

    ios - map 注释搜索

    iphone - 将纬度/经度转换为度数/弧度?

    sql - 将计算值存储在数据库中是个坏主意吗?

    MYSQL 查询 DateTime,查找现有预订

    sql - 如何选择与同一个表中的相应行不匹配的行?

    ios - URLSession 发送 GET 请求而不是 POST

    iphone - UITableView 上方的 UINavigationBar

    ios - 如何在同一台 iOS 设备上将文件从一个应用程序传输到另一个应用程序?

    iphone - 在不让用户更新的情况下更新 iPhone 应用程序?

    iphone - 根据手机图像iphone显示图像