我有一个NSManagedObject,它具有纬度和经度的两个 double 属性。在创建NSManagedObject子类时,我选中“使用标量值”复选框。 .h文件将属性声明为:
@property (nonatomic) double latitude;
@property (nonatomic) double longitude;
我正在从网络服务中检索纬度和经度值,并使用以下内容在本地设置它们:
double tempLatitude = [[location objectForKey:@"lat"] doubleValue];
double tempLongitude = [[location objectForKey:@"lng"] doubleValue];
但是,当我尝试使用NSManagedObject子类中动态创建的setter时,应用程序会出现EXC_BAD_ACCESS。
[newPlace setLatitude:tempLatitude];
我还尝试将tempLatitude和tempLongitude转换为NSNumber值,但是setter告诉我,我“发送'NSNumber * __ strong'参与不兼容类型'double'”
如何正确转换我在Core Data对象中检索存储的值?或者我是否在NSManagedObject子类中创建了某种自定义setter。
如果这是一个重复的问题,我道歉。我搜索了很多,大多数答案都停在“只是存储纬度/长度为双倍”而没有详细说明。
修改 要求提供更多代码。我已将它分散到几个文件中,但我将一个简单的请求整合到我的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
以下是设置上下文,创建子类实例以及尝试为其写入double值的代码块:
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];
答案 0 :(得分:0)
我最终只是将NSManagedObject子类的属性更改为NSNumber并将NSNumber值分配给对象。它似乎有效。我希望我知道"对"这样做的方法,如果这不是。
答案 1 :(得分:0)
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"];