我有一个处理用户位置的应用程序
我的代码是
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)"总是正确的,不管是passedlat还是paessedlng,我也试图用
@"(((2-2)*(3-3)) <> 0)"它的计算结果也为true
还要注意,self calcDist:DoctorDistance返回0.00005
发布于 2013-04-29 02:24:53
Core Data fetch请求中使用的谓词不能正确处理括号。通过设置启动参数"-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"而不是使用。这似乎是核心数据错误,如果您使用谓词,例如与filteredArrayUsingPredicate一起使用,则不会发生这种情况。
作为一种解决方法,您可以展开谓词中的所有括号:
@"%f * %f - 2 * %f * lat + lat * lat + %f * %f - 2 * %f * lng + lng * lng < %f", ...那么你应该会得到预期的结果。
发布于 2013-04-28 21:08:12
我注意到,您是在平方坐标之间的差异,但比较一个简单的距离值。
我建议在谓词之外进行计算。
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];。
注:当然你知道这只是一个距离的近似值,因为地球不是一个平坦的表面,而是一个离心椭球。
https://stackoverflow.com/questions/16263075
复制相似问题