【问题标题】:EXC_BAC_ACCESS error when saving core data Boolean field保存核心数据布尔字段时出现 EXC_BAC_ACCESS 错误
【发布时间】:2023-03-23 13:25:01
【问题描述】:

我在尝试将 TRUE 值保存到包含 Boolean 属性的托管对象中时收到 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 传递给另一个布尔字段来更新它并且没有遇到问题。

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

【问题讨论】:

    标签: ios xcode core-data boolean nsmanagedobject


    【解决方案1】:

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

    【讨论】:

      【解决方案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];
      

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

      【讨论】:

      • 非常感谢您的回复。它似乎运作良好,但要确认它,我需要检查数据库中的值是否已更新。我会用if (cgTrafficCamera.favourite == [NSNumber numberWithInt:0])if (cgTrafficCamera.favourite == [NSNumber numberWithBool:YES]) 或其他东西替换if (cgTrafficCamera.favourite == NO) 吗?
      • 更新:(cgTrafficCamera.favourite == [NSNumber numberWithInt:0]) 工作正常。感谢您的帮助
      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多