如何使用CoreData执行计算查询 [英] How do I perform a calculated query using CoreData

查看:93
本文介绍了如何使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆