iphone - 使用 NSPredicate 从 NSManagedObjectContect 获取准确的 NSDate

标签 iphone objective-c nsdate nspredicate fetch

我正在尝试获取我的实体“MeterReading”的结果,它有两个属性,“timestamp”和“reading”。 “时间戳”是一个 NSDate。我现在正在尝试获取具有确切日期的对象。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MeterReading" inManagedObjectContext:context];
[request setEntity:entity];
NSLog(@"%f", [self.timestamp timeIntervalSince1970]);

NSPredicate *pre = [NSPredicate predicateWithFormat:@"timestamp == %@", self.timestamp];
NSLog(@"%@", pre);
[request setPredicate:pre];

现在,self.timestamp 被预先传递给另一个 ViewController,NSLog 显示:

1290264372.210091

NSPredicate 日志

timestamp == CAST(311957172.210091, "NSDate")

第一个问题:为什么这两个数字不一样?

第二个也是更重要的问题:在 ManagedContext 中,我有四个带日期的条目。如果我使用“<=”而不是“==”,我得到的结果的日期确实小于我传递的日期,包括我想要的日期。为什么我不能用“==”运算符得到一个单一的日期?这可能与我的日期精度有关吗?

谢谢!

最佳答案

这与本质上不安全的浮点相等性检查是同一个问题。随着浮点值被传递、转换、用于算术等,它们一点一点地失去准确性。您可能必须使用更复杂的谓词来代替检查特定公差范围内的日期;例如,

NSArray *timestamps = [NSArray arrayWithObjects:
    [self.timestamp dateByAddingTimeInterval:-1],
    [self.timestamp dateByAddingTimeInterval:1],
    nil
];

NSPredicate *pre = [NSPredicate predicateWithFormat:@"timestamp BETWEEN %@", timestamps];

这会为您提供与您的日期正负一秒匹配的任何对象。

关于iphone - 使用 NSPredicate 从 NSManagedObjectContect 获取准确的 NSDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237739/

相关文章:

iphone - 播放最大的扬声器音量,然后使用 AVAudioPlayer --- IOS 重置到之前的音量

iphone - UIView不显示 socket

objective-c - 调整 WebView 实例的大小

ios - IOS中没有可见的@interface声明选择器 'ordinalityOfUnit:inUnit:forDate:'

ios - 将时间字符串转换为日期并找到即将到来的日期

ios - initWithTimeInterval遇到问题

ios - 如何从 WatchKit Extension 调用 CoreData 代理框架?

iphone - 无法在 iPhone 或 Mac 上播放 wav 音频文件

objective-c - UIWebView 和 UITapGestureRecognizer 上的 UIScrollView 冲突

ios - 我可以处理 UITabbarController 中的双击吗