首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在coredata谓词中进行减法和乘法时,IOS核心数据错误

在coredata谓词中进行减法和乘法时,IOS核心数据错误
EN

Stack Overflow用户
提问于 2013-04-28 20:54:10
回答 2查看 342关注 0票数 0

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

我的代码是

代码语言:javascript
复制
 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];

问题是谓词中的第一部分,即

代码语言:javascript
复制
@"( ( ((%f  -  lat) * (%f  -  lat)) + ((%f - lng) * (%f - lng)) ) <  %f)"

总是正确的,不管是passedlat还是paessedlng,我也试图用

代码语言:javascript
复制
 @"(((2-2)*(3-3)) <> 0)"

它的计算结果也为true

还要注意,self calcDist:DoctorDistance返回0.00005

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-29 02:24:53

Core Data fetch请求中使用的谓词不能正确处理括号。通过设置启动参数"-com.apple.CoreData.SQLDebug 3",可以看到上一个示例谓词

代码语言:javascript
复制
@"(((2-2)*(3-3)) <> 0)"

转换为SQL查询。

代码语言:javascript
复制
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

这意味着括号是忽略的和谓词

代码语言:javascript
复制
@"2 - 2 * 3 - 3 <> 0"

而不是使用。这似乎是核心数据错误,如果您使用谓词,例如与filteredArrayUsingPredicate一起使用,则不会发生这种情况。

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

代码语言:javascript
复制
@"%f * %f - 2 * %f * lat + lat * lat + %f * %f - 2 * %f * lng + lng * lng < %f", ...

那么你应该会得到预期的结果。

票数 0
EN

Stack Overflow用户

发布于 2013-04-28 21:08:12

我注意到,您是在平方坐标之间的差异,但比较一个简单的距离值。

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

代码语言:javascript
复制
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];

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16263075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档