按 BETWEEN 属性过滤核心数据结果

Posted

技术标签:

【中文标题】按 BETWEEN 属性过滤核心数据结果【英文标题】:Filter Core Data results by property BETWEEN 【发布时间】:2015-12-29 06:35:44 【问题描述】:

我目前有 Core Data 成功返回了名为 Event 的特定实体的所有结果:

NSManagedObjectContext *context = [delegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Event" 
                                                     inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];

NSError *error;
NSArray *fetchResults = [context executeFetchRequest:request error:&error];

现在在日历绘制时,我需要获取开始日期在本月或之前且结束日期也在本月或之后的事件。

我相信答案与 NSPredicate 有关,但我对它还不够熟悉,无法让它服从我的意愿。

【问题讨论】:

请向我们展示您的尝试。 您要登录以获取当前月份之间的数据吗? @PetahChristian 这是谓词 NSPredicate *predicateClass = [NSPredicate predicateWithFormat:@"(field_start_date >= %@) AND (field_end_date 【参考方案1】:

将条件改为谓词:

NSDate * firstDateOfMonth = [self returnDateForMonth:month year:year day:2];
NSDate * lastDateOfMonth = [self returnDateForMonth:month+1 year:year day:1];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(startDate => firstDateOfMonth) and (endDate <= lastDateOfMonth)”];

NSManagedObjectContext *context = [delegate managedObjectContext];

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Event"                                              inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
[request setPredicate:predicate];

NSError *error;

NSArray *fetchResults = [context executeFetchRequest:request error:&error];

【讨论】:

您的查询部分正确,因为它只会影响属于该月的那些开始结束日期,但假设一个事件开始于 2014 年 11 月并将结束于 2018 年 11 月,这种情况将不起作用...对吗? 是的,到时候它就行不通了。您需要根据自己的要求修改该条件。

以上是关于按 BETWEEN 属性过滤核心数据结果的主要内容,如果未能解决你的问题,请参考以下文章

核心数据。按日期过滤

核心数据谓词根据日期属性过滤对象

SQL Server 查询使用 BETWEEN 过滤器带来不匹配的数据

MySQL的WHERE语句中BETWEEN与IN的使用教程

c#,datatable中对时间的过滤过滤

将核心数据过滤/排序到数组中