2009-08-25 7 views
0

J'ai un modèle de base de données mis en place, avec deux entités dans une relation un-à-plusieurs (éléments, et pour chaque élément, il peut y avoir plusieurs ResetDates). Je suis assez confiant que le modèle est correctement configuré.Problème avec les dates de données de base

Je peux ajouter de nouveaux éléments et, dans ce cas, ajouter un nouveau ResetDate (en utilisant la date actuelle, avec [NSDate date]). Je peux récupérer et afficher des éléments. Ce qui me dérange, c'est récupérer et afficher les ResetDates.

Mise à jour: Cela fonctionne maintenant, merci beaucoup aux répondeurs ci-dessous. Voici le code en question:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"resetDate" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1]; 

NSMutableArray *sortedResets = [[NSMutableArray alloc] initWithArray:[item.resets allObjects]]; 
[sortedResets sortUsingDescriptors:sortDescriptors]; 

NSDate *oldDate = [[sortedResets lastObject] resetDate]; 
if (!oldDate) { 
    oldDate = [NSDate date]; 
} 

NSInteger numberOfDays = [self timeIntervalWithStartDate:oldDate withEndDate:currentDate]; // This function works fine, when given two NSDate objects 

daysSinceLabel.text = [NSString stringWithFormat:@"%d days", numberOfDays]; 

Répondre

3

D'abord, NSArray -objectAtIndex: ne retournera pas nil si vous passez un indice qui est hors des limites, il soulèvera une NSRangeException, quand vous n'êtes pas sûr de la index, et besoin d'utiliser -objectAtIndex:, vous devez appeler la méthode -count avant de vérifier. Plus important encore, un NSArray ne peut pas contenir de valeur nil, car nil n'est pas un objet.

Alors, non, ce n'est pas un objet NSDate, lorsque vous demandez item pour sa réinitialisations relation (item.resets), vous obtenez un NSSet qui contiennent Reset objets gérés en retour, non NSDate objets, ce que vous voulez est l'attribut resetDate de les objets gérés Reset retournés, peut-être quelque chose comme ceci:

// NSArray -lastObject method return nil if the array is empty 
// Sending messages to nil is Ok there, so we can call resetDate directly 

NSDate *oldDate = [[sortedResets lastObject] resetDate]; 
if (!oldDate) { 
    oldDate = [NSDate date]; 
} 

espoir qui aident, et que mon anglais est compréhensible ...

+0

Ahhhhh, d'accord, d'accord. Cela fait * beaucoup * plus de sens maintenant - c'est un objet 'Reset', pas un' NSDate'. Un problème: 'resetDate' est une propriété' @ 'de la classe 'Reset', pas une méthode. Je ne suis pas très bon avec la syntaxe sur ces choses encore ... essayé '[[sortedResets lastObject] .resetDate]', mais ce n'est clairement pas ce que je cherche ... – Triz

+0

@Triz depuis 'resetDate' est déclaré comme '@ property', votre objet Reset * will * aura les méthodes' resetDate' et 'setResetDate:'. C'est tout le point de la syntaxe '@ property'. –

+0

@Dave: Droit, d'accord. Je reçois un avertissement sur cette ligne, cependant, qu'il n'y a pas de méthode 'resetDate' déclarée.Je l'ai dans l'en-tête de la classe 'Reset', comme' @property (nonatomic, conserver) NSDate * resetDate, ', et dans la mise en œuvre' @dynamic resetDate; '. Devrait-il être '@ synthesize' au lieu de' @ dynamic'? Ce dernier est la façon dont le modèle CoreData j'ai commencé à faire des choses, alors je l'ai gardé. – Triz

1

remplaçant Peut-être:

NSDate *oldDate = sortedResets[0]; 

avec:

NSDate *oldDate = [sortedResets objectAtIndex:0]; 

aidera. sortedResets est un objet NSArray, pas un tableau C;)

+0

Je recommande également de remplacer la 'initWithOb jects: count: 'méthode pour créer le tableau sortDescriptors avec la méthode plus simple' initWithObject: '. –

+0

Dave: Ceci ('NSArray * sortDescriptors = [[NSArray alloc] initWithObject: sortDescripteur];') ne fonctionne pas - ai-je oublié quelque chose? – Triz

+0

Brian: Merci pour ça, j'oublie parfois que je ne suis plus en C :) Je pense que ça me rapproche beaucoup plus, mais maintenant je vais avoir des plantages quand un nouvel objet est créé, et ça devient appelé pour afficher la ligne nouvellement créée, mais il n'y a rien à l'index 0 pour le moment. J'ai pensé que le 'if() {}' que j'ai inséré ci-dessus devrait aider, mais il meurt toujours. Des idées? – Triz

Questions connexes