2015-11-21 2 views
0

Je travaille avec Realm et j'ai un tableau trié par date pour toutes les entrées d'une carte spécifique. Je dois créer un NSPredicate (ou un autre moyen) qui me donnera toutes les dates pour cette carte pour un mois spécifique. Mon problème est que certains mois ont des quantités différentes de jours en eux.Requête de plage de dates de domaine dans Objective-C

Voici ce que j'ai jusqu'à présent.

// 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]; 

code me donne toutes les dates ci-dessus pour une carte spécifique j'ai besoin des dates pour un mois donné, donc je l'ai essayé cette solution collante mais je pense qu'il ya quelque chose de plus élégant pour dire le moins.

NSDate *todaysDate = [NSDate date]; 
NSTimeInterval secondsInMonth =- (60 * 60 * 24 * 365)/12; 
NSDate *dateOneMonthBack = [todaysDate dateByAddingTimeInterval:secondsInMonth]; 

NSPredicate *backDatesPred = [NSPredicate predicateWithFormat: @"date BETWEEN {%@, %@}", dateOneMonthBack, todaysDate]; 

plus étant le code méchant, il va aussi me ramener un mois de la date actuelle et non seulement revenir au début du mois. J'ai regardé la documentation du Realm, NSCalendar, et le guide NSPredicate et maintenant ma tête nage en essayant de compter tous les problèmes possibles qui peuvent mal se passer avec ça. Tout conseil ou extrait de code serait d'une grande aide.

Répondre

0

Je ne sais pas si je comprends bien votre question, le code suivant est ce que vous voulez?

Pour déterminer la date du mois précédent, ajoutez NSDateComponet qui a un mois moins à la date.

Le domaine prend en charge la requête BETWEEN. Donc, vous pouvez juste interroger par deux jours.

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]; 
+0

C'est proche de ce que je cherche, mais ce code va saigner plus dans le mois précédent comme le code exemple (bien qu'évidemment laid) je fournis. Ce que je cherche, c'est un moyen de revenir au début du mois en cours d'où la date est aujourd'hui. Il pourrait donc y avoir un jour, trois jours en arrière, 24 jours en arrière, etc. pour arriver au début du mois. Désolé de ne pas avoir clarifié cela plus clairement. Cela aide cependant. – Robert

+0

Donc, votre question est de savoir comment utiliser NSDateComponents, non? Si vous souhaitez obtenir hier: changez simplement comps.month = -1' en comps.day = -1'. trois jours en arrière: 'comps.day = -3', 24 jours en arrière:' comps.day = -24' etc. –