使用来自 Core Data 的日期获取记录

Posted

技术标签:

【中文标题】使用来自 Core Data 的日期获取记录【英文标题】:Fetching an record using date from Core Data 【发布时间】:2013-11-20 21:14:55 【问题描述】:

我想做的很简单。

    我正在核心数据表中保存一条记录。 在用户默认值中将记录日期保存为时间间隔。 尝试使用间隔再次检索记录,即在日期中进行转换。

但是,每次我得到一个空数组。仅供参考,我也在检查记录是否实际保存,即使保存了结果也是空集。

将记录和存储日期保存为间隔的方法

RequestInfo * newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"RequestInfo"inManagedObjectContext:self.managedObjectContext];

newEntry.jukeboxPhoneNo = request.L;
newEntry.trackName = request.TN;
newEntry.trackNo = request.T;
newEntry.date = [NSDate date];

NSTimeInterval lastID = [newEntry.date timeIntervalSince1970];
NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:[NSString stringWithFormat:@"%f", lastID] forKey:LAST_REQUEST_ID_KEY];
[prefs synchronize];   

if (![self.managedObjectContext save:&error]) 
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);

else 
    NSLog(@"Object is saved");

获取记录的方法

NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];
NSString* lastDateInterval = (NSString*)[prefs objectForKey:LAST_REQUEST_ID_KEY];
NSTimeInterval lastID = [lastDateInterval doubleValue];
NSLog(@"Last ID %f", lastID);
// Check it
if(lastID!=0) 
    NSDate* soughtDate =[[NSDate alloc] initWithTimeIntervalSince1970:lastID];

    NSEntityDescription *productEntity=[NSEntityDescription entityForName:@"RequestInfo" inManagedObjectContext:self.managedObjectContext];

    NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
    [fetch setEntity:productEntity];

    NSPredicate *p= [NSPredicate predicateWithFormat:@"(date >=%@) AND (date <= %@)", soughtDate, soughtDate];
    [fetch setPredicate:p];
    NSError *fetchError;
    NSArray *fetchedProducts = [self.managedObjectContext executeFetchRequest:fetch error:&fetchError];
    RequestInfo* request = [fetchedProducts objectAtIndex:0];

我在谓词中尝试了 == to 但没有奏效。它每次都给我返回一个空数组。我最近才开始在 Objective-c 中编程,所以我也可能犯了一个愚蠢的错误。

【问题讨论】:

为什么是时间间隔和字符串? 【参考方案1】:

将 newEntry.objectID 保存在用户首选项中,然后使用 objectID 获取 ManagedObject。这肯定是条目的唯一键。

【讨论】:

这是正确的方法。另一种选择是直接将 NSDate 保存在用户默认值中,而不是将其转换为 NSTimeInterval 然后将其转换为 NSString。 对不起,我试过了,但用户首选项不保存 ID 或其 URI 表示。【参考方案2】:

更好的方法是增加一列并使用变量为其赋予唯一的 id 并将其存储在用户首选项中。我发现它非常简单和有用。

【讨论】:

以上是关于使用来自 Core Data 的日期获取记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Data JPA 获取两个日期之间的记录

获取 Spring Data 上按日期排序的最后记录

将 `lastModified` 记录添加到 Core Data 托管对象

Swift Core Data 两个排序描述符

Swift Core Data Fetch 按日期和时间存储为字符串并排序

如何在 Core Data 中存储没有时间的日期