CoreData 实体获取请求

Posted

技术标签:

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

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

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

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

【问题讨论】:

或许TimeInterval上的一个类别,添加一个计算和返回'totalTime'的方法? 【参考方案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

【讨论】:

以上是关于CoreData 实体获取请求的主要内容,如果未能解决你的问题,请参考以下文章

iphone coredata 获取请求排序

通过将新项目保存到具有继承的过滤获取请求的CoreData错误

如何从 CoreData 实体获取结果

在 CoreData 中执行获取请求的最佳方法是啥?

CoreData 获取请求 NSPredicate 不起作用

CoreData 获取请求 - 获取所有有关系的对象