2009-04-16 11 views
100

Dire, abbiamo una tabella creata come:Come inserire un record SQLite con un datetime impostato su "now" nell'applicazione Android?

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 a ora? Per chiarire, il

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

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

+0

Un problema qui è che Android utilizza SQLite per il DB. È possibile impostare una colonna su un determinato tipo, ma ciò imposta semplicemente l'affinità delle colonne. SQLite ti consente di inserire qualsiasi valore in qualsiasi colonna indipendentemente da come è stato dichiarato. Per SQLite mettere la stringa 'data' in qualsiasi posto è abbastanza ok. sqlite.org ha una spiegazione più approfondita. Sto votando la risposta di e-satis qui sotto, è così che lo faccio (in particolare il modo Java). – Will

risposta

6

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

Il mio pensiero è quello di trovare un modo per afferrare la data/ora corrente e inviarlo al database come un valore di data/ora, o trovare un modo per utilizzare built-in (DATETIME('NOW')) parametro

Check SQLite la anwsers at this SO.com question - potrebbero guidarti nella giusta direzione.

Speriamo che questo aiuti!

7

ci sono un paio di opzioni è possibile utilizzare:

  1. Si potrebbe provare a utilizzare la stringa "(DATETIME ('la società'))", invece.
  2. Inserire manualmente il datetime, ovvero con System.currentTimeMillis()
  3. Quando si crea la tabella SQLite, specificare un valore predefinito per la colonna created_date come data di ora corrente.
  4. Utilizzare SQLiteDatabase.execSQL da inserire direttamente.
+0

Il numero 1 non funziona (almeno non quando si usano 'ContentValues' e' update() ', si mette semplicemente la stringa' DATETIME ('now') 'nella colonna. –

+1

La seconda ha problemi con i fusi orari. inserito un record con un 'DEFAULT CURRENT_TIMESTAMP' e successivamente usato' System.currentTimeMillis() 'per aggiornare.Vedo una differenza di ore –

+0

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

185

Non è possibile utilizzare la funzione datetime utilizzando il wrapper Java "ContentValues". Puoi utilizzare:

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

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) "); 
    
  • o con le funzioni 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); 
    
+0

Si prega di riformattare il codice come 'Esempio di codice' In caso contrario, una buona risposta è – Will

+2

java.util.Date o java.sql.Date? –

+3

java.util.Date, ma sono sicuro che puoi farlo anche con la data java.sql.Date. –

37

Nel mio codice Io uso DATETIME DEFAULT CURRENT_TIMESTAMP come il tipo e vincolo della colonna.

Nel tuo caso la vostra definizione della tabella sarebbe

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

quali tipi di java usi quando leggi i valori? – seb

4

È possibile utilizzare la funzione di java che è:

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

In questo modo, nel vostro db si salva un numero.
Questo numero potrebbe essere interpretato in questo modo:

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

Invece di l in new Date (l), è alquanto vecchio inserire il numero nella colonna di data.
Quindi, hai il tuo appuntamento.
Per esempio ho salvare nel mio db questo numero: 1.332.342,462078 millions
Ma quando chiamo il metodo sopra ho questo risultato: 21-mar-2012 16.07.42

1

funziona per me perfetti:

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

Salva la tua data a lungo.

2

Sulla base @ risposta via e-satis ho creato un metodo privato sulla mia "DBTools" classe quindi l'aggiunta di 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); 
     } 
... 

Utilizzare subito in questo modo: values.put("lastUpdate", getNow());

22

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 Uso delle funzioni Java Data

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); 
+0

Curioso, può si mostra come si cambierà la stringa risultante in un oggetto DATE? – erik

+0

@erik Puoi fornire ulteriori informazioni, non sto esattamente ottenendo ciò che hai detto. –

+0

così sopra si sta prendendo un oggetto Date e lo si converte in una stringa da inserire in una colonna sqlite .. ma quando si estrae quella stringa dal database, come si converte nuovamente in un oggetto Date? – erik

0

Assicurarsi che il campo non è contrassegnato come 'non nullo' alla mentre stai provando ad inserire un timestamp predefinito usando l'espressione "(DATETIME (' ora ')) "

Problemi correlati