Question

J'ai essayé de trouver un moyen judicieux de stocker des données quotidiennes à l'aide de Core Data sur iPhone.

Mon application reçoit des données au format CSV, avec une date mais pas une heure:

date, cycles
2009-08-01, 123
2009-08-02, 234
2009-08-03, 345
2009-08-04, 456

Lorsque ces données sont stockées, il ne devrait y avoir qu’un seul enregistrement par jour. Je pensais que la meilleure chose à faire était de créer un NSDate à stocker, mais de supprimer le temps écoulé. données de fuseau horaire.

Je peux facilement créer un NSDate sans heures, minutes ou secondes à l'aide de NSDateComponents ou d'un NSDateFormatter. Toutefois, même lorsque je mets le fuseau horaire explicitement sur UTC ou sur zéro seconde à partir de GMT, la sortie d’une date créée avec NSLog () toujours a mon fuseau horaire local comme suit:

2009-07-29 00:00:00 +0100

Quelqu'un sait-il qu'il existe un meilleur moyen de créer NSDates sans composante de temps? Ou peut-être un meilleur moyen de stocker les dates?

Était-ce utile?

La solution

Une bonne règle de programmation est de toujours stocker les dates au format UTC. Peu importe que vous utilisiez Core Data ou non; vous devrez quand même faire quelques travaux, car les cours de dattes d’Apple sont vraiment nuls.

Les dates sont représentées en interne sous forme de nombre de secondes depuis une date de référence qui est, je crois, le 1er janvier 2001 à 00:00:00 (bien que la date de référence réelle ne soit pas très importante). Le point est, les objets NSDate sont toujours nativement en UTC. Si les dates que vous obtenez dans votre fichier CSV sont locales, vous devrez procéder de la manière suivante pour obtenir l'heure UTC:

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];

Ensuite, je mettrais l'heure à 00:00:00. Maintenant, vous enregistrez la date, à minuit, en UTC. Pour les besoins de la présentation, vous utiliserez un NSDateFormatter configuré avec le fuseau horaire de votre choix (le fuseau horaire du système est celui par défaut si vous n'en spécifiez pas) pour afficher ces dates.

Cependant, les fuseaux horaires ne comptent pas vraiment pour les dates. Tant que vous vous assurez de définir le fuseau horaire de votre NSDateFormatter sur UTC, vous afficherez toujours la même date, quel que soit le fuseau horaire sélectionné par l'utilisateur sur son appareil.

Si cette solution ne vous convient pas, vous pouvez toujours stocker vos dates dans un autre format. Vous pouvez utiliser un double ou int pour stocker la date dans un format personnalisé (par exemple, le nombre de jours depuis une date de référence), ou vous pouvez même lancer votre propre classe modélisez la date exactement comme vous le souhaitez et stockez-la en tant qu'objet NSData . Tant que la classe implémente NSCoding , vous pouvez la sérialiser en un objet NSData dans Core Data. Il vous suffit de définir le type d'attribut dans Core Data sur "Transformable".

Vous avez une tonne d'options ici et aucune d'elles ne vous oblige à écrire vos propres requêtes et bases de données SQLite.

Autres conseils

Un NSDate n'a pas de fuseau horaire. NSLog utilise votre fuseau horaire local; il indique +0100 car c’est là que vous êtes.

L'objet NSDate incorporera toujours la date et l'heure - pour indiquer les documents qu'il "représente [s] un seul instant dans le temps". et le fait en stockant une valeur de temps depuis sa date de référence (le début du 1er janvier 2001 à GMT, toujours selon la documentation). Par conséquent, vous ne pouvez pas avoir un NSDate qui ignore l'heure du jour.

Plutôt que d’essayer de stocker les dates à votre façon, j’utiliserais encore NSDate dans votre modèle et envisager d’ajouter une paire de méthodes à votre classe d’entités, dont l’une ferait ce que vous avez décrit ci-dessus, en définissant NSDate à 00:00. : 00 un jour donné. L'autre pourrait ne renvoyer que la date d'un NSDate dans votre format préféré. Ils utiliseraient ensuite le getter et le setter générés par Core Data pour accéder à la propriété NSDate.

En utilisant encore NSDate, vous utilisez une classe avec laquelle Core Data peut fonctionner en mode natif, ce qui signifie que vous pouvez toujours utiliser les prédicats pour filtrer ou trier les résultats récupérés par date sans avoir à y réfléchir de manière approfondie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top