CoreData 实体获取请求
Posted
技术标签:
【中文标题】CoreData 实体获取请求【英文标题】:CoreData Entity Fetch Request 【发布时间】:2015-08-25 02:09:01 【问题描述】:我有一个名为TimeInterval
的实体,其唯一属性是startDate
和finishDate
,它们的类型是日期。我显然不需要添加另一个名为 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 实体获取请求的主要内容,如果未能解决你的问题,请参考以下文章
通过将新项目保存到具有继承的过滤获取请求的CoreData错误