【问题标题】:NSFetchedResultsController with date as predicate以日期为谓词的 NSFetchedResultsController
【发布时间】:2012-11-08 08:09:16
【问题描述】:

场景:

我有一个费用跟踪 iOS 应用程序,我将费用从费用详细视图控制器存储到表视图(带有获取的结果控制器)中,该表视图显示费用列表以及类别、金额和日期。我的实体“Money”中确实有一个日期属性,它是支出或收入的父实体。

问题:

我想要的基本上是对给定一周、一个月或一年的费用进行分类,并将其显示为部分标题标题,例如:(2012 年 10 月 1 日至 10 月 7 日),它显示了费用金额和相关内容根据那个特定的星期。该视图中提供了两个按钮,如果我按下右侧按钮,它将一周增加一周(2012 年 10 月 1 日至 10 月 7 日现在显示 2012 年 10 月 8 日至 10 月 15 日),同样,左侧按钮将减少一周一个星期。

我的问题是如何实现上述目标。我写了一些伪代码 - 任何帮助将不胜感激。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date == %@)", dateToFilterFor];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"SomeCacheName"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

为了按一周过滤它,谓词应该是什么?另外,我想在 fetched result controller 中有一个部分名称,但它会是什么?

【问题讨论】:

  • NSPredicate *tomorrowsData = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date
  • @ACB 谢谢,但这并不能真正回答我的问题。我需要知道我们如何计算周并将其放入谓词中。你给了我一个关于谓词的粗略概念。
  • 您可以为此使用 NSDate 和相关方法吗?从按下按钮的两天开始添加/删除 7 天。您是否遇到了问题?
  • @acb 我无法弄清楚我应该如何做到这一点,比如显示一周(NSCalendar 中的开始日 - 星期日),然后如何通过按下按钮将一周增加一周然后在谓词中显示它。你能在我上面写的代码中回答所有这些吗?
  • @ACB 在您的回答中,day1、day2 是什么?我的意思是应该是一周,比如一周的开始日期和一周的结束日期,对吧?

标签: ios core-data nsfetchedresultscontroller


【解决方案1】:

假设用户选择了 10 月 1 日和 10 月 7 日,

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"MM/dd/yyyy"];

NSString *str1 = @"10/01/2012";
NSDate *date1 = [formatter dateFromString:str1];

NSString *str2 = @"10/07/2012";
NSDate *date2 = [formatter dateFromString:str2];

把它当做,

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", date1, date2];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"SomeCacheName"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

为了添加日期,

int addDaysCount = 7; //try with negative values for fetching previous week.

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:addDaysCount];

NSDate *newDate1 = [[NSCalendar currentCalendar] 
                              dateByAddingComponents:dateComponents 
                                              toDate:date1 options:0];
NSDate *newDate2 = [[NSCalendar currentCalendar] 
                              dateByAddingComponents:dateComponents 
                                              toDate:date2 options:0];

将上述谓词与newDate1newDate2 一起使用以获取与这些日期对应的新费用。

如果您想获取特定一周的星期日,请使用NSDateComponents

NSDateComponents *components = [NSDateComponents new]; 
components.weekday = 1;//represents sunday 
components.year = 2012; 
components.weekOfMonth = 1;
components.month = 10; //etc..

NSDate *date1 = [[NSCalendar currentCalendar] dateFromComponents: components]; 

对于more details on NSDateComponents and its properties check

【讨论】:

  • 谢谢。我将执行您编写的内容,看看是否可行。
  • 为了获得一周中的星期一,您可以使用 NSDateComponents。 NSDateComponents *components = [NSDateComponents new]; components.weekday = 2;//表示星期一 components.year = 2012; components.month = etc.. NSDate *date = [[NSCalendar currentCalendar] dateFromComponents: components];更多详情请查看developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
  • 我的一周将从星期日开始,所以我使用 setDay:1 表示星期日。
  • 通过使用最后一个块,您可以在按下左键或右键时获得不同的星期开始/结束日期。
  • 我用上面的代码测试过,它可以工作。我现在正在使用递增和递减按钮对其进行测试。你能告诉我如何显示带有这样标题的部分标题(Oct1- Oct7, 2012)?我是否必须在 FRC 中填写部分名称键路径,但使用什么名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2011-01-29
  • 2011-03-25
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多