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

时间:2014-03-17 20:37:03

标签: ios objective-c core-data

我有一个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];

2 个答案:

答案 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"];
相关问题