尝试将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来更新另一个布尔字段并且没有遇到问题。
任何想法导致错误的原因是什么?
答案 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];
如果您不需要存储布尔值,则可以保留它,并使其成为瞬态属性。在这种情况下,你可能需要摆脱“(非原子)”。