在核心数据中存储纬度/经度

Posted

技术标签:

【中文标题】在核心数据中存储纬度/经度【英文标题】:Storing latitude/longitude in Core Data 【发布时间】:2014-03-17 20:37:02 【问题描述】:

我有一个 NSManagedObject,它有两个 double 纬度和经度属性。创建 NSManagedObject 子类时,我选中“使用标量值”复选框。 .h 文件将属性声明为:

@property (nonatomic) double latitude;
@property (nonatomic) double longitude;

我正在从 Web 服务中检索纬度和经度值,并使用以下内容在本地设置它们:

double tempLatitude = [[location objectForKey:@"lat"] doubleValue];
double tempLongitude = [[location objectForKey:@"lng"] doubleValue];

但是,当我尝试使用 NSManagedObject 子类中动态创建的设置器时,应用程序会因 EXC_BAD_ACCESS 而崩溃。

[newPlace setLatitude:tempLatitude];

我还尝试将 tempLatitude 和 tempLongitude 转换为 NSNumber 值,但设置器告诉我,我 “将 'NSNumber *__strong' 发送到不兼容类型 'double' 的参数”

如何正确转换要检索的值以存储在我的 Core Data 对象中?或者我是否在我的 NSManagedObject 子类中创建了某种自定义设置器。

如果这是一个重复的问题,我很抱歉。我已经搜索了很多,大多数答案都停留在“只存储 lat/long as doubles”,而没有详细说明。

编辑 请求了更多代码。我把它分散在几个文件中,但是我将一个简单的请求合并到我的 AppDelegate 中只是为了测试,当我尝试运行这个块时它仍然会因为 EXC_BAD_ACCESS 而爆炸。

注意:我现在只是想在内存中保留一个 NSManagedObject(此上下文不指向数据库。)

这是我的托管对象头文件:

Place.h

@interface Place : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic) double latitude;
@property (nonatomic) double longitude;

@end

Place.m

@implementation Place

@dynamic name;
@dynamic latitude;
@dynamic longitude;

@end

这是设置上下文、创建子类实例并尝试向其写入双精度值的代码块:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

NSPersistentStoreCoordinator *memPsc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

NSError *error = nil;

if (![memPsc addPersistentStoreWithType:NSInMemoryStoreType
                          configuration:nil
                                    URL:nil
                                options:nil
                                  error:&error])

    [NSException raise:@"Open failed!" format:@"Reason: %@", [error localizedDescription]];


NSManagedObjectContext *memContext = [[NSManagedObjectContext alloc] init];

[memContext setPersistentStoreCoordinator:memPsc];

Place *place = [NSEntityDescription insertNewObjectForEntityForName:@"Place" inManagedObjectContext:memContext];

double tempLatitude = [@"1.23" doubleValue];
double tempLongitude = [@"3.456" doubleValue];

[place setLatitude:tempLatitude];  // BLOWS UP HERE: EXC_BAD_ACCESS
[place setLongitude:tempLongitude];

【问题讨论】:

尝试将其转换为 NSNumber 我做到了。 (见上文。)一旦我将它作为 NSNumber,setter 说它是不兼容的数据类型。 Scalar type in Managed Object only works for IPhone 5 的可能重复项 如果头文件被声明为double,为什么要在上面调用doubleValue? [newPlace setLatitude:someDouble]newPlace.latitude = someDouble 如果选择了“使用标量值”,则应该可以正常工作。无需将双打转换为 NSNumber。您能否提供有关崩溃的更多信息? 【参考方案1】:

我最终只是将 NSManagedObject 子类的属性更改为 NSNumber 并将 NSNumber 值分配给对象。它似乎奏效了。如果不是这样,我希望我知道“正确”的做法。

【讨论】:

【参考方案2】:
    NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Contacts"     inManagedObjectContext:context];

NSNumber *longitudesNumber = [NSNumber numberWithDouble:longitudes];
NSNumber *latitudesNumber = [NSNumber numberWithDouble:latitudes];
[newDevice setValue: longitudesNumber forKey:@"longitude"];
[newDevice setValue: latitudesNumber   forKey:@"latitude"];

【讨论】:

以上是关于在核心数据中存储纬度/经度的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 数据库中存储纬度/经度时使用的理想数据类型是啥?

在 Mysql 中存储经度/纬度的数据类型

将经度和纬度数据存储在数据库中,并查询附近的记录

用于存储纬度和经度的数据类型 [重复]

float 和 double 数据类型是不是适合存储纬度和经度? [复制]

存储经度和纬度值需要哪种数据类型[重复]