ios - 使用CoreData,对实体的基本类型属性赋值时出错

 藏A组合别_577 发布于 2022-10-28 23:44

情形如下:一个用于记录工作任务的表,每条记录是一个任务。

首先创建xcdatamodeld文件,包括:

name:【String】:任务名称
timetodo:【Double】:计划完成耗时
isValid:【Integer 16】:完成状况
enddate:【Date】:完成日期
等等,类型仅限上面四种。

从菜单生成NSManagedObject文件,属性:

@property (nullable, nonatomic, copy) NSDate *enddate;
@property (nonatomic) double timetodo;
@property (nonatomic) int16_t isvalid;
@property (nullable, nonatomic, copy) NSString *name;

等等,以及@dynamic。

实际使用中发现,在任何地方对timetodo、isvalid赋值都报错,其他属性正常,例如

theTask.timetodo = [dic[@"did"] doubleValue]; 
theTask.timetodo = 1.0;
[theTask setTimetodo:1.0];

执行到此句,都报EXC_BAD_ACCESS异常:error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=EXC_I386_GPFLT).

查了相关的问题,有说property必须是Objective C的对象类型的,基本类型的字段自动生成属性会变成NSNumber,也有说在ios新版中可以自动类型转换balabala不知所云。求解此处为何报错?如何给基本类型属性赋值?

捞捞

1 个回答
  • 自己找到了解。链接

    Core Data 支持包括整形、浮点型、布尔型在内的许多常见数据类型,但是数据模型编辑器默认以 NSNumber 生成这些属性并内置于 managed object 子类中。这使得我们经常会在程序代码中用调用 floatValue,boolValue,integerValue 等 NSNumber 的方法。但我们同样可以直接设置这些属性为想要的标量类型,如 int64_t,float_t 或是 BOOL,方法就是在右边Attribute内选中Use Scalar Type。

    这样生成 NSManagedObject(原始数据类型使用标量属性),不再会是类似:

    @property (nonatomic, strong) NSNumber *myInteger;

    而会用如下声明替换:

    @property (nonatomic) int64_t myInteger;

    看来用原始数据类型时,无法自动的为标量生成存取方法,需要手动编写,否则报错。

    2022-10-30 04:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有