ios - 使用CoreData,对实体的基本类型属性赋值时出错
高洛峰
高洛峰 2017-04-18 09:53:11
0
1
353

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

首先创建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不知所云。求解此处为何报错?如何给基本类型属性赋值?

捞捞

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(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;

看來用原始資料型別時,無法自動的為標量產生存取方法,需要手動寫,否則報錯。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!