在核心数据中存储纬度/经度
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 数据库中存储纬度/经度时使用的理想数据类型是啥?