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

我有一个与我的xcdatamodeld对象中定义的datetypes属性的对象。 为什么用NSTimeInterval生成NSManagedObject类? 如何设置一个NSDate,然后得到一个NSDate呢?

我得到这个,如果我检查“使用原始数据types的标量属性”checkbox,当我正在生成我的文件。

这是因为NSTimeInterval是伪装的双倍,而NSDate是从NSObjectinheritance的类。

编辑:显然dateWithTimeIntervalSince1970只适用于NSDateFormatterNSDate使用不同于NSDateFormatter引用,正如评论中所解释的那样,它在2001年。对不起,我的无知。

如果在为实体生成NSManagedObject子类时select了“为原始数据types使用标量属性”,则将使用标量属性,如int和float,而不是NSNumber 。 这包括NSDate; 它会把NSDate变成一个NSTimeInterval ,这只是一个双倍的。 这个NSTimeInterval是自苹果公司1970年标准时代以来的一个时间间隔(如果它在1970年以前,它可能是负的)。

NSTimeInterval转换成NSDate非常简单,如果你需要的话,但是如果你没有一个庞大的数据库,那么你可能不想打扰select这个checkbox。

要将此时间间隔转换为NSDate只需使用[NSDate dateWithTimeIntervalSince1970: timeInterval]; timeInterval是你从数据库中得到的。 这可以放在你的NSManagedObject子类中,这样当你得到这个属性时,你会得到一个NSDate

如果要使用混合实体同时使用标量属性表示和非标量属性表示(如int32_t用于整数或布尔型属性,但NSDate*用于date属性),则需要手动编辑生成的托pipe对象.h文件。

因此,我通常通过检查选项使用基本数据types的标量属性 (因为我有更多的整数和布尔属性比date)开始创build托pipe对象类。 然后我编辑创build的头文件如下:

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 

如果您不喜欢手动编辑此文件,您也可以select使用允许访问标量属性的类别来添加便利属性,就好像它是对象一样。

myEntity所+ Convenience.h:

 @interface MYEntity (Convenience) @property (nonatomic, readwrite) NSDate *theDate @end 

myEntity所+ Convenience.h:

 @implementation MYEntity (Convenience) - (NSDate *)theDate { return [NSDate dateWithTimeIntervalSinceReferenceDate:self.date]; } - (void)setTheDate:(NSDate *)theDate { self.date = [theDate timeIntervalSinceReferenceDate] } @end 

为了使代码在这个例子中更具可读性,我将命名数据模型devise器中的原始属性dateTimeInterval和具有期望名称的便利属性: date

第二种方法显然也起反作用。 您可以使用非标量属性导出您的实体,然后提供一个便捷的标量属性,其中的getter和setter访问原始的非标量属性。