2013-04-25 110 views
1

当试图保存TRUE值转换为包含Boolean属性的管理对象时,我得到一个错误EXC_BAC_ACCESS错误EXC_BAC_ACCESS。保存核心数据布尔字段

id delegate = [[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = [delegate managedObjectContext]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrafficCameraInfo" 
               inManagedObjectContext:self.managedObjectContext]; 


    [fetchRequest setEntity:entity]; 
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"code=%@",self.selectedTrafficCamera.code]]; 

    NSError *error; 
    TrafficCameraInfo *cgTrafficCamera; 

    cgTrafficCamera = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] lastObject]; 

    NSString *alertMessage; 
    if (cgTrafficCamera.favourite == NO){ 
     cgTrafficCamera.name = @"TEST";     <-- works ok 
     cgTrafficCamera.favourite = 1;     <-- causes an error 
    } else { 
     cgTrafficCamera.favourite = 0; 
    } 

    error = nil; 
    if (![self.managedObjectContext save:&error]) { 

管理对象接口看起来是这样的:

@interface TrafficCameraInfo : NSManagedObject 

@property (nonatomic, retain) NSString *code; 
@property (nonatomic, retain) NSString *postCode; 
@property (nonatomic, retain) NSNumber *latitude; 
@property (nonatomic, retain) NSNumber *longitude; 
@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSString *url; 
@property (nonatomic) Boolean favourite; 

@end 

其他地方在我的应用我被路过1以更新另一个布尔字段,我不遇到问题。

任何想法是什么导致错误?

回答

2

布尔是一个简单的标量非指针数据类型。核心数据属性始终存储为对象。数字数据类型的Objective-C对象包装是NSNumber。所以,如果favourite是一个普通存储的属性,你应该把它声明为:

@property (nonatomic, retain) NSNumber *favourite; 

分配将这样进行:

cgTrafficCamera.favourite = [NSNumber numberWithBool:YES]; // Obj-C style is "YES/NO" for BOOL 

或者这样,如果你喜欢:

cgTrafficCamera.favourite = [NSNumber numberWithBool:1]; 

如果你不需要存储布尔值,你可以保留它,使它成为一个瞬态属性。在这种情况下,你可能需要摆脱“(非原子)”。

+0

非常感谢回复的设置数据。它似乎工作正常,但要确认它,我需要检查数据库中已更新的值。我会用'if(cgTrafficCamera.favourite == [NSNumber numberWithInt:0])或者if(cgTrafficCamera.favourite == [NSNumber numberWithBool:YES])替换'if(cgTrafficCamera.favourite == NO)''其他? – cullener 2013-04-25 10:18:21

+0

更新:'(cgTrafficCamera.favourite == [NSNumber numberWithInt:0])'工作正常。感谢您的帮助 – cullener 2013-04-25 13:25:07

+0

不客气。乐意效劳。 – Wienke 2013-04-25 14:36:21

3

我想在你的核心数据属性表中定义的“最爱”变量BOOL,以及这意味着它是一个NSNumber类型,所以你应该使用的NSNumber