Ios 为什么核心数据管理对象中的NSDate转换为NSTimeInterval?
我有一个对象,其属性的日期类型在xcdatamodeld对象中定义。为什么它以NSTimeInterval生成NSManagedObject类?我如何在上面设置一个NSDate,然后再从中获取一个NSDate 如果我在生成文件时选中“对基本数据类型使用标量属性”复选框,就会得到这个结果Ios 为什么核心数据管理对象中的NSDate转换为NSTimeInterval?,ios,core-data,Ios,Core Data,我有一个对象,其属性的日期类型在xcdatamodeld对象中定义。为什么它以NSTimeInterval生成NSManagedObject类?我如何在上面设置一个NSDate,然后再从中获取一个NSDate 如果我在生成文件时选中“对基本数据类型使用标量属性”复选框,就会得到这个结果 这是因为NSTimeInterval是双重伪装,而NSDate是从NSObject继承的类。编辑:显然,dateWithTimeIntervalSince1970仅适用于NSDateFormatterNSDate
这是因为NSTimeInterval是双重伪装,而NSDate是从NSObject继承的类。编辑:显然,
dateWithTimeIntervalSince1970
仅适用于NSDateFormatter
NSDate
使用了与NSDateFormatter
不同的引用,如评论中所述,该引用是在2001年。
对不起我的无知
如果在为实体生成NSManagedObject
子类时选择了“对基本数据类型使用标量属性”,则它将使用int和float等标量属性,而不是NSNumber
。这包括NSDate;它将把NSDate
转换为NSTimeInterval
,这只是一个双精度值。此NSTimeInterval
是自苹果使用1970年标准纪元以来的时间间隔(如果是1970年之前,则可能为负值)
如果需要,将NSTimeInterval
转换回NSDate
非常简单,但是如果您没有大型数据库,那么您可能不想麻烦选中该复选框
要将此时间间隔转换为
NSDate
,只需使用[nsdatedatewithtimeintervalsince1970:timeInterval]代码>其中timeInterval
是从数据库中获取的内容。这可以放在您的NSManagedObject
子类中,这样当您获得该属性时,您仍然可以得到一个NSDate
。如果您想要混合使用标量和非标量属性表示法的实体,例如int32_t
用于整数或布尔属性,而NSDate*
用于日期属性,您需要手动编辑生成的托管对象.h
文件
因此,我通常从创建托管对象类开始,首先选中“对基本数据类型使用标量属性”(因为我的整数和布尔属性比日期多)。然后,我编辑创建的头文件,如下所示:
MYEntity.h
@interface MYEntity : NSManagedObject
@property (nonatomic) int32_t index;
@property (nonatomic) NSTimeInterval date;
@end
然后变成:
@interface MYEntity : NSManagedObject
@property (nonatomic) int32_t index;
@property (nonatomic, retain) NSDate * date;
@end
如果您属于不喜欢手动编辑此文件的类型,还可以选择使用允许访问标量属性的类别添加便利属性,就像访问对象一样
MYEntity+便利。h:
@interface MYEntity (Convenience)
@property (nonatomic, readwrite) NSDate *theDate
@end
@implementation MYEntity (Convenience)
- (NSDate *)theDate {
return [NSDate dateWithTimeIntervalSinceReferenceDate:self.date];
}
- (void)setTheDate:(NSDate *)theDate {
self.date = [theDate timeIntervalSinceReferenceDate]
}
@end
MYEntity+便利。h:
@interface MYEntity (Convenience)
@property (nonatomic, readwrite) NSDate *theDate
@end
@implementation MYEntity (Convenience)
- (NSDate *)theDate {
return [NSDate dateWithTimeIntervalSinceReferenceDate:self.date];
}
- (void)setTheDate:(NSDate *)theDate {
self.date = [theDate timeIntervalSinceReferenceDate]
}
@end
为了使本例中的代码更具可读性,我将在数据模型设计器中命名原始属性dateTimeInterval
,并使用所需名称命名便利属性:date
第二种方法显然也适用,反之亦然。您可以导出具有非标量属性的实体,然后提供一个方便的标量属性,其getter和setter访问原始的非标量属性。这很奇怪。它们应该是NSDate对象。你使用的是哪种商店类型?答案是正确的,但我觉得这种推理毫无意义。Objective-C中的每个类都继承自NSObject。问题是:在生成NSManagedObject子类时,如果选中“将标量属性用于基本数据类型”复选框,为什么字符串属性转换为NSString对象,日期属性转换为NSInterval。顺便说一句,我接受“在苹果工作的小精灵”作为答案。@ElisevanLooij与数字、日期和布尔值不同,字符串不能表示为标量属性,因此复选框不会影响字符串属性的转换。二进制数据属性也一样。如何创建NSManagedObject子类,以便同时包含int和NSDate?@VictorPrograss您可以手动编辑生成的实体,只需将NSTimerInterval
替换为NSDate*
。同时将retain
添加到@property
注释中我不建议编辑生成的属性,因为如果重新生成类,将丢失这些编辑。这不完全正确。docs状态:NSManagedObject使用NSDate对象表示日期属性,并将时间作为参考日期(其时区为GMT)以来的NSTimeInterval值在内部存储。参考日期=2001年1月1日,而不是1970年1月1日。那么,为什么它们具有“dateWithTimeIntervalSince1970”功能?另外,你是说使用原语和不使用原语的存储量没有区别?你应该阅读苹果的文档。我引用了这些文档中的文本。NSDateFormatter的参考日期是1970年1月1日。因此,datewithtimeintervalencesince1970
在使用日期格式化程序时非常有用。但是,你可以问苹果为什么NSDate和NSDateFormatter有不同的参考日期。哦,我明白了。谢谢你的澄清。编辑了我的答案。