如何使用CoreData执行计算查询 [英] How do I perform a calculated query using CoreData
问题描述
我有一个T-SQL背景,所以这个CoreData的东西对我来说有点新。
我是一个应用程序的原型,最终将使用MS SQL后端Web服务
在我的后端我的t-sql查询将是这样:
SELECT *,SQRT(SQUARE(myX - latitude)+ SQUARE(myY - longitude))距离
FROM位置
WHERE纬度> myX
AND latitude< myX + deltaX
AND longitude> myX
AND latitude< myY + deltaY
ORDER BY SQRT(SQUARE(myX - latitude)+ SQUARE(myY - longitude))
$ b b
如何在CoreData中使用谓词(如果是最好的方法)在CoreData中进行同样的查询
NB第一,意识到Core Data是一个对象层次结构,首先是最重要的。因此,您不请求列,请求对象。
这样,您就可以用 NSPredicate $构造一个
NSFetchRequest
c $ c>并且谓词将是以下行的:
[NSPredicate predicate withFormat:@latitude>% @ AND latitude<%@ AND
longitude>%@ and longitude<%@,someFloatObject1,someFloatObject2,
someFloatObject3,someFloatObject4];
您也可以向 NSFetchRequest
虽然你不能在排序中做计算。因此,您可能需要在获取对象后执行排序。
更新
属性,然后有一个方法,像'-updateDistanceCalFrom:someFloat。然后,使用对象数组,您可以执行以下操作:
NSArray * myFetchedArray = ...
[myFetchedArray makeObjectsPerformSelector:@(updateDistanceCalcFrom :)
withObject:someFloatObject];
NSSortDescriptor * calcSort = ...;
NSArray * descriptors = [NSArray arrayWithObject:calcSort];
[calcSort release],calcSort = nil;
NSArray * sortedArray = [myFetchedArray sortedArrayUsingDescriptors:descriptors];
I have an T-SQL background so this CoreData stuff is a little new to me.
I am prototyping an app which will eventually use an MS SQL backend webservice for querying.
In my backend my t-sql query would be something like this:
SELECT *, SQRT(SQUARE(myX - latitude) + SQUARE(myY - longitude)) Distance
FROM Locations
WHERE latitude > myX
AND latitude < myX + deltaX
AND longitude > myX
AND latitude < myY + deltaY
ORDER BY SQRT(SQUARE(myX - latitude) + SQUARE(myY - longitude))
How would I do this same query in CoreData in my prototype using a predicate (if thats the best method)
N.B. its more the order by that Im interested in
First, realize that Core Data is an object hierarchy first and foremost. Therefore you do not request columns, you request objects.
With that, you would want to construct a NSFetchRequest
with a NSPredicate
and the predicate would be something along the lines of:
[NSPredicate predicate withFormat:@"latitude > %@ AND latitude < %@ AND
longitude > %@ and longitude < %@", someFloatObject1, someFloatObject2,
someFloatObject3, someFloatObject4];
You can also add a sort to the NSFetchRequest
although you cannot do calculations within the sort. Therefore you may want to perform the sort after the objects are fetched.
update
You can have a transient property on your objects and then have a method that says something like '-updateDistanceCalFrom:someFloat`. Then, with an array of objects you could do the following:
NSArray *myFetchedArray = ...
[myFetchedArray makeObjectsPerformSelector:@(updateDistanceCalcFrom:)
withObject:someFloatObject];
NSSortDescriptor *calcSort = ...;
NSArray *descriptors = [NSArray arrayWithObject:calcSort];
[calcSort release], calcSort = nil;
NSArray *sortedArray = [myFetchedArray sortedArrayUsingDescriptors:descriptors];
这篇关于如何使用CoreData执行计算查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!