Ios 为什么核心数据管理对象中的NSDate转换为NSTimeInterval?

Ios 为什么核心数据管理对象中的NSDate转换为NSTimeInterval?,ios,core-data,Ios,Core Data,我有一个对象,其属性的日期类型在xcdatamodeld对象中定义。为什么它以NSTimeInterval生成NSManagedObject类?我如何在上面设置一个NSDate,然后再从中获取一个NSDate 如果我在生成文件时选中“对基本数据类型使用标量属性”复选框,就会得到这个结果 这是因为NSTimeInterval是双重伪装,而NSDate是从NSObject继承的类。编辑:显然,dateWithTimeIntervalSince1970仅适用于NSDateFormatterNSDate

我有一个对象,其属性的日期类型在xcdatamodeld对象中定义。为什么它以NSTimeInterval生成NSManagedObject类?我如何在上面设置一个NSDate,然后再从中获取一个NSDate

如果我在生成文件时选中“对基本数据类型使用标量属性”复选框,就会得到这个结果


这是因为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有不同的参考日期。哦,我明白了。谢谢你的澄清。编辑了我的答案。