J'ai du mal à travailler avec les dates sur mon application Android qui utilise SQLite. J'ai quelques questions:
- Quel type dois-je utiliser pour stocker des dates dans SQLite (texte, entier, ...)?
- Étant donné la meilleure façon de stocker des dates, comment les stocker correctement à l'aide de ContentValues?
- Quelle est la meilleure façon de récupérer la date de la base de données SQLite?
- Comment faire une sélection SQL sur SQLite, en classant les résultats par date?
Réponses:
Vous pouvez utiliser un champ de texte pour stocker des dates dans
SQLite
.Le stockage des dates au format UTC, la valeur par défaut si vous utilisez,
datetime('now')
(yyyy-MM-dd HH:mm:ss)
permettra alors le tri par colonne de date.La récupération de dates sous forme de chaînes
SQLite
peut ensuite être formatée / convertie selon les besoins en formats régionaux régionalisés à l'aide du calendrier ou de laandroid.text.format.DateUtils.formatDateTime
méthode.Voici une méthode de formatage régionalisé que j'utilise;
la source
La meilleure façon est de stocker les dates sous forme de nombre, reçues à l'aide de la commande Calendrier.
Pourquoi faire ceci? Tout d'abord, il est facile d'obtenir des valeurs à partir d'une plage de dates. Convertissez simplement votre date en millisecondes, puis interrogez de manière appropriée. Le tri par date est également facile. Les appels à convertir entre différents formats sont également faciles, comme je l'ai inclus. En bout de ligne, avec cette méthode, vous pouvez faire tout ce que vous devez faire, sans problème. Il sera légèrement difficile de lire une valeur brute, mais cela compense largement ce léger inconvénient d'être facilement lisible et utilisable par la machine. Et en fait, il est relativement facile de construire un lecteur (et je sais qu'il y en a) qui convertira automatiquement la date et l'heure en tant que telle pour en faciliter la lecture.
Il convient de mentionner que les valeurs qui en découlent devraient être longues, pas int. Un entier dans sqlite peut signifier beaucoup de choses, allant de 1 à 8 octets, mais pour presque toutes les dates, 64 bits ou plus, c'est ce qui fonctionne.
EDIT: Comme cela a été souligné dans les commentaires, vous devez utiliser le
cursor.getLong()
pour obtenir correctement l'horodatage si vous faites cela.la source
Pour le stockage, vous pouvez utiliser une méthode utilitaire
ainsi:
Une autre méthode utilitaire prend en charge le chargement
peut être utilisé comme ceci:
La commande par date est une simple clause SQL ORDER (car nous avons une colonne numérique). L'ordre suivant décroît (c'est la date la plus récente qui commence en premier):
Assurez-vous toujours de stocker l' heure UTC / GMT , en particulier lorsque vous travaillez avec
java.util.Calendar
etjava.text.SimpleDateFormat
qui utilise le fuseau horaire par défaut (c'est-à-dire votre appareil).java.util.Date.Date()
est sûr à utiliser car il crée une valeur UTC.la source
SQLite peut utiliser des types de données texte, réels ou entiers pour stocker des dates. De plus, chaque fois que vous effectuez une requête, les résultats sont affichés en utilisant le format
%Y-%m-%d %H:%M:%S
.Maintenant, si vous insérez / mettez à jour des valeurs de date / heure à l'aide des fonctions de date / heure SQLite, vous pouvez également stocker des millisecondes. Si tel est le cas, les résultats sont affichés en utilisant le format
%Y-%m-%d %H:%M:%f
. Par exemple:Maintenant, faire quelques requêtes pour vérifier si nous sommes réellement en mesure de comparer les temps:
Vous pouvez vérifier la même en
SELECT
utilisantcol2
etcol3
vous obtiendrez les mêmes résultats. Comme vous pouvez le voir, la deuxième ligne (126 millisecondes) n'est pas renvoyée.Notez que
BETWEEN
c'est inclusif, donc ...... renverra le même ensemble.
Essayez de jouer avec différentes plages de date / heure et tout se comportera comme prévu.
Et sans
strftime
fonction?Qu'en est-il sans
strftime
fonction et sans millisecondes?Et alors
ORDER BY
?Fonctionne très bien.
Enfin, lorsqu'il s'agit d'opérations réelles au sein d'un programme (sans utiliser l'exécutable sqlite ...)
BTW: J'utilise JDBC (je ne suis pas sûr des autres langues) ... le pilote sqlite-jdbc v3.7.2 de xerial - peut-être que des révisions plus récentes modifient le comportement expliqué ci-dessous ... Si vous développez sous Android, vous ne le faites pas besoin d'un pilote jdbc. Toutes les opérations SQL peuvent être soumises à l'aide du
SQLiteOpenHelper
.JDBC a différentes méthodes pour obtenir des valeurs de date / heure réelle à partir d' une base de données:
java.sql.Date
,java.sql.Time
etjava.sql.Timestamp
.Les méthodes connexes
java.sql.ResultSet
sont (évidemment)getDate(..)
,getTime(..)
etgetTimestamp()
respectivement.Par exemple:
Étant donné que SQLite n'a pas de type de données DATE / TIME / TIMESTAMP réel, toutes ces 3 méthodes retournent des valeurs comme si les objets étaient initialisés avec 0:
Donc, la question est: comment pouvons-nous réellement sélectionner, insérer ou mettre à jour des objets Date / Heure / Horodatage? Il n'y a pas de réponse facile. Vous pouvez essayer différentes combinaisons, mais elles vous forceront à intégrer des fonctions SQLite dans toutes les instructions SQL. Il est beaucoup plus facile de définir une classe utilitaire pour transformer du texte en objets Date dans votre programme Java. Mais rappelez-vous toujours que SQLite transforme toute valeur de date en UTC + 0000.
En résumé, malgré la règle générale de toujours utiliser le type de données correct, ou même des entiers indiquant le temps Unix (millisecondes depuis l'époque), je trouve beaucoup plus facile d'utiliser le format SQLite par défaut (
'%Y-%m-%d %H:%M:%f'
ou en Java'yyyy-MM-dd HH:mm:ss.SSS'
) plutôt que de compliquer toutes vos instructions SQL avec Fonctions SQLite. L'ancienne approche est beaucoup plus facile à maintenir.TODO: Je vérifierai les résultats lors de l'utilisation de getDate / getTime / getTimestamp dans Android (API15 ou mieux) ... peut-être que le pilote interne est différent de sqlite-jdbc ...
la source
Habituellement (comme je le fais dans mysql / postgres), je stocke les dates dans int (mysql / post) ou texte (sqlite) pour les stocker au format d'horodatage.
Ensuite, je vais les convertir en objets Date et effectuer des actions basées sur l'utilisateur TimeZone
la source
La meilleure façon de stocker
date
dans SQlite DB est de stocker le courantDateTimeMilliseconds
. Voici l'extrait de code pour le faire_Now, your data (date is in currentTimeMilliseconds) is get inserted in DB .
L'étape suivante est, lorsque vous souhaitez récupérer des données de la base de données, vous devez convertir les millisecondes de date et d'heure respectives en date correspondante. Voici un exemple d'extrait de code pour faire de même_
J'espère que cela aidera tout le monde! :)
la source
1 -Exactement comme StErMi l'a dit.
2 - Veuillez lire ceci: http://www.vogella.de/articles/AndroidSQLite/article.html
3 -
vois ici:
Query () dans SQLiteDatabase
4 - voir réponse 3
la source
Je préfère ça. Ce n'est pas le meilleur moyen, mais une solution rapide.
la source
la source