我有一个实体“Event”女巫包含两个属性:date(NSDate)和repeat(NSInteger - 0 = NONE,1 = DAILY,2 = WEEKLY,3 = MONTHLY,...)。
有谁知道如何通过重复传递日期来过滤事件?
示例:
第一次活动:01-01-2010 /周期 第二次活动:2010年2月10日/月刊 当前日期:10-06-2010
请求:
获取所有事件,其中Event.date ==“当前日期”或Event.date.day ==“当前日期”.day如果Event.repeat ==每月
返回事件:
第二次活动
我希望有人理解我要解释的内容:s
答案 0 :(得分:2)
这里的问题是NSDate没有day
(或任何其他类似的)属性。如果确实如此,你的谓词就会按照书面形式工作。
数据和时间编程看起来很复杂。例如,在通常使用中,短语“相同日期”表示完全相同的日历日。但是,从代码的角度来看,它也意味着相同的周,月和年,因为与任何其他任意日历部门相比,日期对代码来说并不重要。即使在普通使用中,“日”也可以指特定的小时范围,例如2010年8月21日星期六,或者它可以指“任何一天内”的任意24小时范围。这个应用程序需要哪一个?
NSDate实际上是一个微秒准确时间戳的对象包装器。它具有转换为字符串以及创建和比较时间戳的方法,但它不了解日历属性,如秒,分钟,小时,天,周,月或年。这就是NSCalendar的用途,Core Data并不天生支持该类作为数据类型,因为所有可能的日历都会复杂化。
如果模型中需要日历属性,则需要创建一个模拟日历日期的自定义实体。将实体属性设置为您需要建模的日历属性,然后将对象与需要日历日期的对象设置为属性,例如
CalendarDate{
date:NSDate
minute:int
hour:int
day:int
month:int
year:int
events<--(required,nullify)-->>Event.date
}
您可以为实体创建自定义类,并提供一种方法,根据传递的NSDate和您选择的任何日历自动填充对象。
现在您的谓词很容易。
NSPredicate *myPred;
myPred=[NSPredicate predicateWithFormat:@"(date.date==%@ or date.day==%i) AND repeat=%i", currentDate, 45, kMonthly];
这似乎很麻烦,但由于日历日期的真实复杂性,它是必需的。根本没有简单的方法来处理所有用途的日期和时间计算和比较。
答案 1 :(得分:0)
我不确定这可以在SQLite级别完成。一旦你的事件被记入记忆中肯定可以做到,但我怀疑,这会打败你的目标。
可能有一些聪明的方法可以对数据进行反规范化,从而创建一个可以过滤的情况。
例如,如果您将月份和月份的日期拉出到整数字段中,您可以根据事物的对齐情况设计一种方法来确定。它不是直接来找我,但我肯定会朝那个方向寻求解决方案。
日历倾向于使用的另一种替代方法是为即将到来的特定日期创建依赖事件。创建事件时,您将创建所有相关事件,以便您只过滤日期。讨厌是肯定的。
最后一个选项是将所有事件拉入内存并从那里计算。