0

我有一个处理用户位置的应用程序

我的代码是

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"DoctorTable" inManagedObjectContext:[myData managedObjectContext]];
[fetchRequest setEntity:entity];


passedLat = @"32.067288";
passedLng = @"33.325347";
NSPredicate *predicate = [NSPredicate predicateWithFormat:

                          @"( ( ((%f  -  lat) * (%f  -  lat)) + ((%f - lng) * (%f - lng)) ) <  %f)"
                          " and kind  == 0"

                          , passedLat.doubleValue, passedLat.doubleValue, passedLng.doubleValue, passedLng.doubleValue, [self calcDist:DoctorDistance], nil];

[fetchRequest setPredicate:predicate];

问题是谓词的第一部分是

@"( ( ((%f  -  lat) * (%f  -  lat)) + ((%f - lng) * (%f - lng)) ) <  %f)"

无论 passlat 或 paessedlng 我也尝试将其替换为

 @"(((2-2)*(3-3)) <> 0)"

这也评估为真

还要注意 [self calcDist:DoctorDistance] 返回 0.00005

4

2 回答 2

0

我注意到您正在对坐标之间的差异进行平方,但与简单的距离值进行比较。

我建议在谓词之外进行计算。

float passedLat = 32.067288;
float passedLng = 33.325347;

float distance = [self calcDist:DoctorDistance]; 
float lowerLat = passedLat - distance; 
float upperLat = passedLat + disstance;
float lowerLng = passedLng - distance;
float upperLng = passedLng + distance; 

fetchRequest.predicate = [NSPredicate predicateWithFormat: 
        @"(lat < %f && lat > %f) && (lng < %f && lng > %f)", 
         upperLat, lowerLat, upperLng, lowerLng];

.

注意:当然你知道这只是距离的近似值,因为地球不是一个平面,而是一个离心椭球。

于 2013-04-28T13:08:11.730 回答
0

Core Data 获取请求中使用的谓词不能正确处理括号。通过设置启动参数“-com.apple.CoreData.SQLDebug 3”可以看到你的最后一个示例谓词

@"(((2-2)*(3-3)) <> 0)"

被翻译成 SQL 查询

CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, ... FROM ZENTITY t0 WHERE ? - ? * ? - ? <> ? 
CoreData: details: SQLite bind[0] = 2
CoreData: details: SQLite bind[1] = 2
CoreData: details: SQLite bind[2] = 3
CoreData: details: SQLite bind[3] = 3
CoreData: details: SQLite bind[4] = 0

这意味着括号被忽略并且谓词

@"2 - 2 * 3 - 3 <> 0"

改为使用。这似乎是一个核心数据错误,如果您使用谓词,例如 with ,则不会发生filteredArrayUsingPredicate

作为一种解决方法,您可以展开谓词中的所有括号:

@"%f * %f - 2 * %f * lat + lat * lat + %f * %f - 2 * %f * lng + lng * lng < %f", ...

然后你应该得到预期的结果。

于 2013-04-28T18:24:53.243 回答