【问题标题】:CoreData Entity Fetch RequestCoreData 实体获取请求
【发布时间】:2015-08-25 02:09:01
【问题描述】:

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

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

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

【问题讨论】:

  • 或许TimeInterval上的一个类别,添加一个计算和返回'totalTime'的方法?

标签: objective-c core-data xcdatamodel nsentitydescription fetched-property


【解决方案1】:

您可以使用单独的属性(如果您愿意,也可以使用完整的瞬态属性)来做到这一点。

考虑这样的事情......

@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

【讨论】:

  • transient 属性的好主意,确实,没有想到那个。我不会那样做,因为我不希望模型具有决定性(让另一个开发人员认为总时间实际上被节省了)。我也不会将该属性直接添加到 Entity 类中,并且可以在将来重新创建该类,因此是子类或类别(在这种情况下我更喜欢)。
【解决方案2】:

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

我的回答是: 不,你不应该创建它的 fetched 属性,因为你不希望它作为你的实体的属性,所以你只需要创建一个方法让我们说

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

}

//然后调用这个方法使用

[self getTotalTimeWithStartDate:startDate withFinishDate:finishDate];

【讨论】:

  • 我已经说过我知道可以使用timeIntervalSinceDate 计算时差。您的解决方案确实有效,但正如我在解决方案中所展示的那样,一个类别更适合这种情况。
【解决方案3】:

为了对同一张表的不同列进行数学计算,我们基本上是使用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]

【讨论】:

  • @Ankit_Thakur 我很快就会看看你的解决方案,但看起来我需要的东西有点过头了。
【解决方案4】:

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

@implementation TimeInterval (Extras)

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

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多