1

EXC_BAC_ACCESS尝试将 TRUE 值保存到包含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 传递给另一个布尔字段来更新它并且没有遇到问题。

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

4

2 回答 2

3

我认为在您的核心数据属性表中,您将“最喜欢的”变量定义为 BOOL,这意味着它是 NSNumber 类型,因此您应该使用 NSNumber 设置数据

于 2013-04-25T09:04:40.017 回答
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];

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

于 2013-04-25T06:15:00.800 回答