2

我有一个 NSManagedObject 类,它保存在 Core Data 的 SQLite 数据库中。此对象具有持久的纬度和经度属性。我正在尝试创建一个 NSFetchedRequestController 来获取该类的所有实例,这些实例与用户有一定的距离。做了一些研究,Core Data 似乎不可能做到这一点,因为 Core Data 只支持边界框样式查询,不支持带有块的谓词。

例如,我有一类具有纬度和经度属性的组。给定纬度和经度(例如,用户),获取给定纬度和经度半径 6 英里范围内的所有组。

class Group{
     var latitude: Float
     var longitude: Float
}

我想利用 Core Data 的 R-Tree Indexing 对用户附近的班级实例的纬度和经度进行快速边界框查询。然后我想用更精确的谓词过滤结果,使用我自己的代码块来查看哪些实例位于我的用户当前位置。这是“边界框”查询。

let request: NSFetchRequest<Group> = Group.fetchRequest()
let (topLeft,bottomRight) = boundingBox(center: center, radius: searchRadius)
let maxLat = topLeft.latitude
let minLon = topLeft.longitude
let minLat = bottomRight.latitude
let maxLon = bottomRight.longitude
let predicate = NSPredicate(format: "(%f < longitude AND longitude < %f) AND (%f < latitude AND latitude < %f)", minLon, maxLon, minLat, maxLat)
request.predicate = predicate

问题是我想要一个看起来像这样的提取:

let location: CLLocation = /* Initialize a CLLocation */

let predicate = NSPredicate { (obj, _) -> Bool in
     let object = obj as! Group
     let objLocation = CLLocation(latitude: Double(object.latitude), longitude: Double(object.longitude))
     return location.distance(from: objLocation) < 9656 //6 miles in meters
}

NSFetched 结果控制器不允许带有块的谓词。这两个提取之间存在显着差异。第一个获取边界框中的所有组(minLat、minLon、maxLat 和 maxLat),后者获取给定半径的 Circle 中的所有组。

然后我想使用 NSFetchedRequestController 在表格中显示结果,并利用良好的自动更新功能。但当然,Core Data 只支持边界框样式查询,不支持我需要的两步过滤方法。有合适的解决方案吗?

如果 Core Data 根本无法用于这种类型的使用,我愿意使用其他数据库。我看了一下 YapDatabase,它似乎更灵活,并且包括 R-Tree 索引,但我担心它没有得到很好的支持。Realm 不支持 R-Tree 索引。

4

0 回答 0