Ios 在核心数据中存储纬度/经度
我有一个NSManagedObject,它有两个纬度和经度的双重属性。创建NSManagedObject子类时,我选中使用标量值复选框。.h文件将属性声明为:Ios 在核心数据中存储纬度/经度,ios,objective-c,core-data,Ios,Objective C,Core Data,我有一个NSManagedObject,它有两个纬度和经度的双重属性。创建NSManagedObject子类时,我选中使用标量值复选框。.h文件将属性声明为: @property (nonatomic) double latitude; @property (nonatomic) double longitude; 我正在从web服务检索纬度和经度值,并在本地使用以下内容设置它们: double tempLatitude = [[location objectForKey:@"lat"] do
@property (nonatomic) double latitude;
@property (nonatomic) double longitude;
我正在从web服务检索纬度和经度值,并在本地使用以下内容设置它们:
double tempLatitude = [[location objectForKey:@"lat"] doubleValue];
double tempLongitude = [[location objectForKey:@"lng"] doubleValue];
但是,当我尝试使用NSManagedObject子类中动态创建的setter时,应用程序会因EXC_BAD_访问而崩溃
[newPlace setLatitude:tempLatitude];
我还尝试将tempLatitude和templantude转换为NSNumber值,但setter告诉我,我正在将“NSNumber*\uu strong”发送到不兼容类型为“double”的参数
如何正确转换正在检索的值以存储在核心数据对象中?或者在我的NSManagedObject子类中创建某种自定义setter
[newPlace setLatitude:tempLatitude];
如果这是一个重复的问题,我道歉。我已经搜索了很多次,大多数答案都停留在商店的lat/long-as-double上,没有详细说明
编辑
要求提供更多代码。我将它分散在几个文件中,但我将一个简单的请求整合到AppDelegate中只是为了进行测试,当我尝试运行此块时,它仍然会因EXC_BAD_访问而崩溃
注意:我现在只是想在内存中保存一个NSManagedObject。这个上下文并没有指向数据库
这是我的托管对象头文件:
地点
地点
下面是一组设置上下文、创建子类实例并尝试向其写入双值的代码:
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];
最后,我只是将NSManagedObject子类的属性更改为NSNumber,并将NSNumber值分配给对象。这似乎奏效了。我希望我知道正确的方法,如果不是的话。尝试将其转换为NSNUMBER,我就是这么做的。见上文。一旦我将其作为NSNumber,setter就会说它是一种不兼容的数据类型。如果头文件声明为Double,那么为什么要对其调用doubleValue?[newPlace setLatitude:someDouble]或newPlace.latitude=someDouble,如果选择了使用标量值,则应该可以工作。无需将双精度转换为NSNumber。你能提供更多关于坠机的信息吗?
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"];
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"];