Objective-C 中的领域日期范围查询
Realm date range query in Objective-C
我正在使用 Realm,我有一个按日期排序的数组,用于特定卡片的所有条目。我需要创建一个 NSPredicate(或其他方式),它会按照特定月份的顺序为我提供该卡的所有日期。我的问题是有些月份的天数不同。
这是我目前所知道的。
// Filter specific card, create date and string for x axis
NSString *filteredName = [NSString stringWithFormat:@"%@", self.cardType];
NSDate *dateElement = [[NSDate alloc]init];
NSString *datedString = [[NSString alloc]initWithFormat:@""];
//Formatting datedString
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"MM/dd/YYYY";
NSSortDescriptor *dateSort = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:YES];
NSArray *sortedArray = @[dateSort];
//self.orderHistory is all of the cards from the Realm database filtered down to a specific type of card.
for (Order *uniqueOrder in [self.orderHistory objectsWhere:@"name = [c] %@", filteredName]) {
// [self.uniqueCardArray addObject:uniqueOrder];
dateElement = uniqueOrder.date;
datedString = [df stringFromDate:dateElement];
[self.uniqueDatesForCardArray addObject:datedString];
}
[self.uniqueCardArray sortUsingDescriptor:sortedArray];
上面的代码为我提供了特定卡片的所有日期,我需要给定月份的日期,所以我尝试了这个俗气的解决方案,但我认为至少可以说有更优雅的东西。
NSDate *todaysDate = [NSDate date];
NSTimeInterval secondsInMonth =- (60 * 60 * 24 * 365) / 12;
NSDate *dateOneMonthBack = [todaysDate dateByAddingTimeInterval:secondsInMonth];
NSPredicate *backDatesPred = [NSPredicate predicateWithFormat: @"date BETWEEN {%@, %@}", dateOneMonthBack, todaysDate];
除了它是令人讨厌的代码之外,它还会使我从当前日期返回一个月,而不仅仅是回到月初。一直在查看 Realm 文档、NSCalendar 资料和 NSPredicate 指南,现在我的头在游动,试图计算所有可能出现问题的问题。任何建议或代码片段都会有很大帮助。
不知道我是否理解正确,下面的代码是你想要的吗?
要确定上个月的日期,请将 NSDateComponet
加上带有负月的日期。
Realm 支持 BETWEEN
查询。所以你可以按两天查询。
NSDate *todaysDate = [NSDate date];
NSDateComponents *comps = [NSDateComponents new];
comps.month = -1;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *dateOneMonthBack = [calendar dateByAddingComponents:comps toDate:todaysDate options:kNilOptions];
RLMResults *filteredHistory = [self.orderHistory objectsWhere:@"name = [c] %@", filteredName];
RLMResults *rangedHistory = [filteredHistory objectsWhere:@"date BETWEEN {%@, %@}", dateOneMonthBack, todaysDate];
我正在使用 Realm,我有一个按日期排序的数组,用于特定卡片的所有条目。我需要创建一个 NSPredicate(或其他方式),它会按照特定月份的顺序为我提供该卡的所有日期。我的问题是有些月份的天数不同。
这是我目前所知道的。
// Filter specific card, create date and string for x axis
NSString *filteredName = [NSString stringWithFormat:@"%@", self.cardType];
NSDate *dateElement = [[NSDate alloc]init];
NSString *datedString = [[NSString alloc]initWithFormat:@""];
//Formatting datedString
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"MM/dd/YYYY";
NSSortDescriptor *dateSort = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:YES];
NSArray *sortedArray = @[dateSort];
//self.orderHistory is all of the cards from the Realm database filtered down to a specific type of card.
for (Order *uniqueOrder in [self.orderHistory objectsWhere:@"name = [c] %@", filteredName]) {
// [self.uniqueCardArray addObject:uniqueOrder];
dateElement = uniqueOrder.date;
datedString = [df stringFromDate:dateElement];
[self.uniqueDatesForCardArray addObject:datedString];
}
[self.uniqueCardArray sortUsingDescriptor:sortedArray];
上面的代码为我提供了特定卡片的所有日期,我需要给定月份的日期,所以我尝试了这个俗气的解决方案,但我认为至少可以说有更优雅的东西。
NSDate *todaysDate = [NSDate date];
NSTimeInterval secondsInMonth =- (60 * 60 * 24 * 365) / 12;
NSDate *dateOneMonthBack = [todaysDate dateByAddingTimeInterval:secondsInMonth];
NSPredicate *backDatesPred = [NSPredicate predicateWithFormat: @"date BETWEEN {%@, %@}", dateOneMonthBack, todaysDate];
除了它是令人讨厌的代码之外,它还会使我从当前日期返回一个月,而不仅仅是回到月初。一直在查看 Realm 文档、NSCalendar 资料和 NSPredicate 指南,现在我的头在游动,试图计算所有可能出现问题的问题。任何建议或代码片段都会有很大帮助。
不知道我是否理解正确,下面的代码是你想要的吗?
要确定上个月的日期,请将 NSDateComponet
加上带有负月的日期。
Realm 支持 BETWEEN
查询。所以你可以按两天查询。
NSDate *todaysDate = [NSDate date];
NSDateComponents *comps = [NSDateComponents new];
comps.month = -1;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *dateOneMonthBack = [calendar dateByAddingComponents:comps toDate:todaysDate options:kNilOptions];
RLMResults *filteredHistory = [self.orderHistory objectsWhere:@"name = [c] %@", filteredName];
RLMResults *rangedHistory = [filteredHistory objectsWhere:@"date BETWEEN {%@, %@}", dateOneMonthBack, todaysDate];