CoreData 实体获取请求

CoreData Entity Fetch Request

我有一个名为 TimeInterval 的实体,它的唯一属性是 startDatefinishDate,它们的类型是日期。我显然不需要添加另一个名为 totalTime 的属性,因为可以通过以下方式计算:[finishDate timeIntervalSinceDate: startDate]

我可以为属性 totalTime 创建提取的 属性 吗?如果不是,那么最好的方法是什么,而不必将 totalTime 添加为属性,因为这似乎是多余的。

顺便说一下,我是 Core-Data 的新手。

我可以为属性 totalTime 创建一个提取的 属性 吗?如果不是,那么最好的方法是什么,而不必将 totalTime 添加为属性,因为这似乎是多余的。

我的回答是: 不,您不应该创建其获取的 属性,因为您不想将其作为实体的属性,因此您只需创建一个方法让我们说

-(NSTimeInterval) getTotalTimeWithStartDate:(NSDate *)startDate withFinishDate:(NSDate *)finishDate{
NSTimeInterval interval = [startDate timeIntervalSinceDate:finishDate];
return interval;

}

//然后使用

调用这个方法
[self getTotalTimeWithStartDate:startDate withFinishDate:finishDate];

为了对相同table的不同列进行数学计算,我们基本上使用NSExpressionDescription,并将其设置为NSFetchRequest,如下所示:

NSExpressionDescription *expressionDesc = [[NSExpressionDescription alloc] init];
[expressionDesc setName:@"totalTime"];
NSExpression *expression = [NSExpression expressionForFunction:@"multiply:by:"
                                                    arguments:@[[NSExpression expressionForKeyPath:@"startDate"],
                                                               [NSExpression expressionForKeyPath:@"finishDate"]];
[expressionDesc setExpression:expression];
[expressionDesc setExpressionResultType:NSInteger64AttributeType];

fetchRequest.propertiesToFetch = @[expressionDesc]

使用获取的属性似乎不适合我的情况。 TimeInterval 上的一个简单类别就可以解决问题:

@implementation TimeInterval (Extras)

-(NSTimeInterval)intervalTime
{
    return [self.finisheDateTime timeIntervalSinceDate: self.startDateTime];
}

@end

您可以使用单独的 属性(如果您愿意,也可以使用完整的瞬态属性)。

考虑这样的事情...

@interface Item : NSManagedObject
@property (nonatomic, readonly, assign) NSTimeInterval totalTime;
@end


@implementation Item
- (NSTimeInterval)totalTime
{
    [self willAccessValueForKey:@"totalTime"];
    NSDate *finishDate = [self primitiveFinishDate];
    NSDate *startDate = [self primitiveStartDate];
    NSTimeInterval result = [finishDate timeIntervalSinceDate: startDate];
    [self didAccessValueForKey:@"totalTime"];
    return result;
}
@end