Come inserire un record SQLite con un datetime impostato su "ora" nell'applicazione Android?


109

Diciamo, abbiamo una tabella creata come:

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

Per inserire un record, userei

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

Ma come impostare la colonna date_created su adesso ? Per chiarire, il

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

Non è la soluzione giusta. Imposta semplicemente la colonna sul testo "datetime ('now')".


1
Un problema qui è che Android utilizza SQLite per il DB. È possibile impostare una colonna su un certo tipo, ma questo imposta solo l '"affinità" delle colonne. SQLite ti consentirà di inserire qualsiasi valore in qualsiasi colonna indipendentemente da come viene dichiarato. Per SQLite mettere la stringa "data" ovunque va bene. sqlite.org ha una spiegazione più completa. Voto a favore della risposta di e-satis di seguito, è così che lo faccio (in particolare in Java).
Will

Risposte:


194

Non è possibile utilizzare la funzione datetime utilizzando il wrapper Java "ContentValues". O puoi usare:

  • SQLiteDatabase.execSQL in modo da poter inserire una query SQL non elaborata.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • O le funzionalità di data e ora java:

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

1
Si prega di riformattare il codice come "Esempio di codice". Altrimenti buona risposta.
Will

3
è un java.util.Date o un java.sql.Date?
Greg B

5
java.util.Date, ma sono sicuro che puoi farlo anche con java.sql.Date date.
e-satis

44

Nel mio codice utilizzo DATETIME DEFAULT CURRENT_TIMESTAMPcome tipo e vincolo della colonna.

Nel tuo caso la definizione della tua tabella sarebbe

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

32

Metodo 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
);

Metodo 2

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

Metodo 3 Utilizzo delle funzioni 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);

Curioso, puoi mostrare come cambieresti la stringa risultante in un oggetto DATE?
erik

@erik Puoi fornire maggiori informazioni, non ho esattamente capito quello che hai detto.
Rikin Patel

quindi sopra stai prendendo un oggetto Date e convertendolo in una stringa da inserire in una colonna sqlite .. ma quando estrai quella stringa dal database, come fai a riconvertirla in un oggetto Date?
erik

1
@erik SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss"); formatter.parse (created_at);
Saksham

8

Ci sono un paio di opzioni che puoi usare:

  1. Puoi provare a utilizzare la stringa "(DATETIME ('now'))".
  2. Inserisci tu stesso il datetime, cioè con System.currentTimeMillis ()
  3. Quando si crea la tabella SQLite, specificare un valore predefinito per la colonna created_date come data e ora corrente.
  4. Usa SQLiteDatabase.execSQL per inserire direttamente.

Il numero 1 non funziona (almeno non quando si usa ContentValuese update(), mette semplicemente la stringa DATETIME('now')nella colonna.
Bart Friederichs

1
Il secondo ha problemi con i fusi orari. Ho inserito un record con un DEFAULT CURRENT_TIMESTAMPe successivamente utilizzato System.currentTimeMillis()per l'aggiornamento. Vedo una differenza di ora.
Bart Friederichs

@sooniln Hai verificato che (DATETIME ('now')) inserirà effettivamente il datetime corrente?
IgorGanapolsky

Se vuoi aggiungere datetime locale, prova a utilizzare "datetime ('now', 'localtime')" "
Simon

7

Per me, il problema sembra che stai inviando "datetime('now')"come una stringa, piuttosto che come un valore.

Il mio pensiero è trovare un modo per prendere la data / ora corrente e inviarla al tuo database come valore di data / ora, o trovare un modo per utilizzare il built-in di SQLite (DATETIME('NOW')) parametro

Dai un'occhiata alle risposte a questa domanda SO.com : potrebbero guidarti nella giusta direzione.

Speriamo che questo aiuti!


5

Puoi usare la funzione di java che è:

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

In questo modo nel tuo db salvi un numero.
Questo numero potrebbe essere interpretato in questo modo:

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

Invece di l nella nuova data (l), devi inserire il numero nella colonna della data.
Quindi, hai il tuo appuntamento.
Ad esempio, salvo nel mio db questo numero: 1332342462078
Ma quando chiamo il metodo sopra ho questo risultato: 21-mar-2012 16.07.42


3

Sulla base della risposta @ e-satis ho creato un metodo privato sulla mia classe "DBTools", quindi aggiungere la data corrente ora è davvero semplice:

...
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);
        }
...

Usalo ora in questo modo: values.put("lastUpdate", getNow());


1

Funziona per me perfetto:

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

Salva la tua data come a lungo.



0

Assicurati che il campo non sia contrassegnato come "non nullo" nello stesso momento in cui stai cercando di inserire un timestamp predefinito utilizzando l'espressione "(DATETIME ('now'))"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.