Comment insérer un enregistrement SQLite avec une date / heure définie sur «maintenant» dans une application Android?

109

Dites, nous avons une table créée comme:

create table notes (_id integer primary key autoincrement, created_date date)

Pour insérer un enregistrement, j'utiliserais

ContentValues initialValues = new ContentValues(); 
initialValues.put("date_created", "");
long rowId = mDb.insert(DATABASE_TABLE, null, initialValues);

Mais comment définir la colonne date_created sur now ? Pour être clair, le

initialValues.put("date_created", "datetime('now')");

N'est pas la bonne solution. Il définit simplement la colonne sur le texte "datetime ('now')".

droidguy
la source
1
Un problème ici est qu'Android utilise SQLite pour la base de données. Vous pouvez définir une colonne sur un certain type, mais cela ne fait que définir l '«affinité» des colonnes. SQLite vous permettra de mettre n'importe quelle valeur dans n'importe quelle colonne, quelle que soit la façon dont elle est déclarée. Pour SQLite, mettre la chaîne 'date' n'importe où est assez bien. sqlite.org a une explication plus approfondie. Je vote pour la réponse d'e-satis ci-dessous, c'est comme ça que je le fais (en particulier la manière Java).
Sera

Réponses:

194

Vous ne pouvez pas utiliser la fonction datetime à l'aide du wrapper Java "ContentValues". Soit vous pouvez utiliser:

  • SQLiteDatabase.execSQL afin que vous puissiez entrer une requête SQL brute.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • Ou les capacités java date / heure:

    // set the format to sql date time
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    Date date = new Date();
    ContentValues initialValues = new ContentValues(); 
    initialValues.put("date_created", dateFormat.format(date));
    long rowId = mDb.insert(DATABASE_TABLE, null, initialValues);
e-satis
la source
1
Veuillez reformater le code en «Exemple de code». Sinon bonne réponse.
Sera
3
est-ce un java.util.Date ou un java.sql.Date?
Greg B
5
java.util.Date, mais je suis sûr que vous pouvez le faire avec la date java.sql.Date également.
e-satis
44

Dans mon code j'utilise DATETIME DEFAULT CURRENT_TIMESTAMP comme type et contrainte de la colonne.

Dans votre cas, votre définition de table serait

create table notes (
  _id integer primary key autoincrement, 
  created_date date default CURRENT_DATE
)
Gautier Hayoun
la source
32

Méthode 1

CURRENT_TIME  Inserts only time
CURRENT_DATE  Inserts only date
CURRENT_TIMESTAMP  Inserts both time and date

CREATE TABLE users(
    id INTEGER PRIMARY KEY,
    username TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Méthode 2

db.execSQL("INSERT INTO users(username, created_at) 
            VALUES('ravitamada', 'datetime()'");

Méthode 3 Utilisation des fonctions java Date

private String getDateTime() {
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        Date date = new Date();
        return dateFormat.format(date);
}

ContentValues values = new ContentValues();
values.put('username', 'ravitamada');
values.put('created_at', getDateTime());
// insert the row
long id = db.insert('users', null, values);
Rikin Patel
la source
Curieux, pouvez-vous montrer comment vous changeriez la chaîne résultante en un objet DATE?
erik
@erik Pouvez-vous donner plus d'informations, je ne comprends pas exactement ce que vous avez dit.
Rikin Patel
donc ci-dessus vous prenez un objet Date et le convertissez en une chaîne à placer dans une colonne sqlite .. mais lorsque vous extrayez cette chaîne de la base de données, comment la reconvertissez-vous en objet Date?
erik
1
@erik SimpleDateFormat formatter = new SimpleDateFormat ("aaaa-MM-jj HH: mm: ss"); formatter.parse (created_at);
Saksham
8

Vous pouvez utiliser plusieurs options:

  1. Vous pouvez essayer d'utiliser la chaîne "(DATETIME ('now'))" à la place.
  2. Insérez vous-même la date / heure, c'est-à-dire avec System.currentTimeMillis ()
  3. Lors de la création de la table SQLite, spécifiez une valeur par défaut pour la colonne created_date comme date et heure actuelle.
  4. Utilisez SQLiteDatabase.execSQL pour insérer directement.
bientôt
la source
Le numéro 1 ne fonctionne pas (du moins pas lors de l'utilisation ContentValueset update(), il met juste la chaîne DATETIME('now')dans la colonne.
Bart Friederichs
1
Le second a des problèmes avec les fuseaux horaires. J'ai inséré un enregistrement avec un DEFAULT CURRENT_TIMESTAMPet plus tard utilisé System.currentTimeMillis()pour mettre à jour. Je vois une heure de décalage.
Bart Friederichs
@sooniln Avez-vous vérifié que (DATETIME ('now')) insérera bien la date / heure actuelle?
IgorGanapolsky
Si vous souhaitez ajouter une date / heure locale, essayez d'utiliser "datetime ('now', 'localtime')" à la place
Simon
7

Pour moi, le problème semble que vous envoyez "datetime('now')"une chaîne plutôt qu'une valeur.

Ma pensée est de trouver un moyen de saisir la date / heure actuelle et de l'envoyer à votre base de données en tant que valeur de date / heure, ou de trouver un moyen d'utiliser le (DATETIME('NOW'))paramètre intégré de SQLite

Consultez les réponses à cette question SO.com - elles pourraient vous conduire dans la bonne direction.

Espérons que cela aide!

Jared Harley
la source
5

Vous pouvez utiliser la fonction de java qui est:

ContentValues cv = new ContentValues();
cv.put(Constants.DATE, java.lang.System.currentTimeMillis());  

De cette façon, dans votre base de données, vous enregistrez un numéro.
Ce nombre pourrait être interprété de cette manière:

    DateFormat dateF = DateFormat.getDateTimeInstance();
    String data = dateF.format(new Date(l));

Au lieu de l dans la nouvelle date (l), vous devez insérer le nombre dans la colonne de date.
Alors, vous avez votre rendez-vous.
Par exemple, j'enregistre dans ma base de données ce numéro: 1332342462078
Mais quand j'appelle la méthode ci-dessus, j'ai ce résultat: 21-mar-2012 16.07.42

Marco Gallella
la source
3

Sur la base de la réponse @ e-satis, j'ai créé une méthode privée sur ma classe "DBTools", donc l'ajout de la date actuelle est maintenant très simple:

...
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
...
        private String getNow(){
            // set the format to sql date time
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            return dateFormat.format(date);
        }
...

Utilisez-le maintenant comme ceci: values.put("lastUpdate", getNow());

Cédric Simon
la source
1

Fonctionne pour moi parfait:

    values.put(DBHelper.COLUMN_RECEIVEDATE, geo.getReceiveDate().getTime());

Gardez votre date comme un long.

Stefan Beike
la source
0

Assurez-vous que le champ n'est pas marqué comme 'non nul' en même temps que vous essayez d'insérer un horodatage par défaut à l'aide de l'expression "(DATETIME ('now'))"

AlokJoshiOfAarmax
la source