保存核心数据布尔字段时出现EXC_BAC_ACCESS错误

时间:2013-04-25 01:05:50

标签: ios xcode core-data boolean nsmanagedobject

尝试将TRUE值保存到包含EXC_BAC_ACCESS属性的托管对象时,出现Boolean错误。

  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 个答案:

答案 0 :(得分:3)

我认为在你的核心数据属性表中你定义了#34;最喜欢的&#34;变量到BOOL,这意味着它是一个NSNumber类型,所以你应该使用NSNumber设置数据

答案 1 :(得分:2)

布尔值是一种简单的标量非指针数据类型。 Core Data属性始终存储为对象。数值数据类型的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];

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