2009-04-16 10 views
100

decir que tenemos una tabla creada como:¿Cómo insertar un registro SQLite con un horario establecido en 'ahora' en la aplicación Android?

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

para insertar un registro, que haría uso de

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

Pero cómo configurar la columna date_created a ahora? Para dejarlo en claro, el

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

No es la solución correcta. Simplemente establece la columna en el texto "datetime ('now')".

+0

Un problema aquí es que Android usa SQLite para la base de datos. Puede configurar una columna para un cierto tipo pero eso solo establece las columnas 'afinidad'. SQLite le permitirá poner cualquier valor en cualquier columna independientemente de cómo se declare. Para SQLite poner la cadena 'date' en cualquier lugar está bastante bien. sqlite.org tiene una explicación más completa. He votado la respuesta de e-satis a continuación, así es como lo hago (específicamente la forma de Java). – Will

Respuesta

6

Para mí, el problema parece ser que está enviando "datetime('now')" como una cadena, en lugar de un valor.

Mi idea es encontrar una manera de asir la fecha/hora actual y enviarlo a su base de datos como un valor de fecha/hora, o encontrar una manera de utilizar de SQLite integrada (DATETIME('NOW')) parámetro

Mira la Awsers al this SO.com question - pueden guiarlo en la dirección correcta.

¡Espero que esto ayude!

7

Hay un par de opciones que puede utilizar:

  1. Usted podría tratar de usar la cadena "(DATETIME ('ahora'))" en su lugar.
  2. Introduzca la fecha y hora usted mismo, es decir, con System.currentTimeMillis()
  3. Al crear la tabla SQLite, especifique un valor predeterminado para la columna created_date como la fecha actual.
  4. Utilice SQLiteDatabase.execSQL para insertar directamente.
+0

El número 1 no funciona (al menos no al usar 'ContentValues' y' update() ', simplemente pone la cadena' DATETIME ('now') 'en la columna. –

+1

El segundo tiene problemas con las zonas horarias. insertó un registro con un 'DEFAULT CURRENT_TIMESTAMP' y más tarde usó' System.currentTimeMillis() 'para actualizar. Veo una diferencia de hora. –

+0

@sooniln ¿Ha verificado que (DATETIME ('ahora')) insertará efectivamente el datetime actual? –

185

No se puede usar la función de fecha y hora utilizando el envoltorio Java "Valores de contenido". O puede usar:

  • SQLiteDatabase.execSQL para que pueda ingresar una consulta SQL sin procesar.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) "); 
    
  • O las capacidades de fecha y hora 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

Por favor, vuelva a formatear el código como 'Code Sample'. De lo contrario, buena respuesta. – Will

+2

es que java.util.Date o una java.sql.Date? –

+3

java.util.Date, pero estoy seguro de que también puede hacerlo con la fecha java.sql.Date. –

37

En mi código que utilizan DATETIME DEFAULT CURRENT_TIMESTAMP como el tipo y la restricción de la columna.

En el caso de que su definición de la tabla sería

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

qué tipos de Java usa cuando lee los valores? – seb

4

Usted puede utilizar la función de Java que es:

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

De esta manera, en su base de datos se guarda un número.
Este número podría ser interpretado de esta manera:

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

en lugar de L en la nueva fecha (L), que Shoul inserte el número en la columna de la fecha.
Entonces, tiene su fecha.
Por ejemplo puedo guardar en mi db este número: 1332342462078
Pero cuando llamo el método anterior i tener este resultado: 21-mar-2012 16/07/42

1

me funciona perfecto:

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

Guarde su fecha como un largo.

2

Sobre la base de @ respuesta e-satis he creado un método privado en mis "DBTools" clase por lo que añadir la fecha actual es ahora muy fácil:

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

uso ahora así: values.put("lastUpdate", getNow());

22

Método 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étodo 2

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

Método 3 utilizando Java Funciones de fecha

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, puede ¿muestra cómo cambiaría la cadena resultante a un objeto DATE? – erik

+0

@erik ¿Puede dar más información? No estoy obteniendo exactamente lo que dijo. –

+0

tan arriba está tomando un objeto Date y convirtiéndolo en una cadena para colocarlo en una columna sqlite ... pero cuando extrae esa cadena de la base de datos, ¿cómo la convierte de nuevo a un objeto Date? – erik

0

asegurarse de que el campo no está marcado como 'no nulo' en el al mismo tiempo que intenta insertar una marca de tiempo predeterminada utilizando la expresión "(DATETIME (' now ')) "

Cuestiones relacionadas