¿Cómo insertar un registro SQLite con una fecha y hora establecida en 'ahora' en la aplicación de Android?

109

Digamos, tenemos una tabla creada como:

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

Para insertar un registro, usaría

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

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

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

No es la solución adecuada. Simplemente establece la columna en texto "datetime ('ahora')".

droide
fuente
1
Un problema aquí es que Android usa SQLite para la base de datos. Puede establecer una columna en un tipo determinado, pero eso solo establece la 'afinidad' de las columnas. SQLite le permitirá poner cualquier valor en cualquier columna independientemente de cómo se declare. Para SQLite, poner la cadena 'fecha' en cualquier lugar está bastante bien. sqlite.org tiene una explicación más completa. Estoy votando la respuesta de e-satis a continuación, así es como lo hago (específicamente a la manera de Java).
Será

Respuestas:

194

No puede utilizar la función de fecha y hora utilizando el contenedor Java "ContentValues". O puedes 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 de 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);
e-satis
fuente
1
Vuelva a formatear el código como 'Ejemplo de código'. De lo contrario, es una buena respuesta.
Será
3
¿Es un java.util.Date o un java.sql.Date?
Greg B
5
java.util.Date, pero estoy seguro de que también puede hacerlo con la fecha java.sql.Date.
e-satis
44

En mi código utilizo DATETIME DEFAULT CURRENT_TIMESTAMPcomo tipo y restricción de la columna.

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

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

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 Uso de funciones de fecha de Java

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
fuente
Curioso, ¿puede mostrar cómo cambiaría la cadena resultante a un objeto DATE?
erik
@erik ¿Puedes dar más información? No entiendo exactamente lo que dijiste.
Rikin Patel
así que 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 en un objeto Date?
erik
1
@erik SimpleDateFormat formateador = nuevo SimpleDateFormat ("aaaa-MM-dd HH: mm: ss"); formatter.parse (creado_en);
Saksham
8

Hay un par de opciones que puede utilizar:

  1. En su lugar, podría intentar usar la cadena "(DATETIME ('ahora'))".
  2. Inserte 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 fecha y hora actual.
  4. Utilice SQLiteDatabase.execSQL para insertar directamente.
pronto
fuente
El número 1 no funciona (al menos no cuando se usa ContentValuesy update(), simplemente coloca la cadena DATETIME('now')en la columna.
Bart Friederichs
1
El segundo tiene problemas con las zonas horarias. Inserté un registro con a DEFAULT CURRENT_TIMESTAMPy luego usé System.currentTimeMillis()para actualizar. Veo una diferencia de hora.
Bart Friederichs
@sooniln ¿Ha verificado que (DATETIME ('ahora')) insertará la fecha y hora actual?
IgorGanapolsky
Si desea agregar fecha y hora local, intente usar "datetime ('ahora', 'localtime')" en su lugar
Simon
7

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

Mi pensamiento es encontrar una manera de tomar la fecha / hora actual y enviarla a su base de datos como un valor de fecha / hora, o encontrar una manera de usar la función incorporada de SQLite (DATETIME('NOW')) parámetro

Consulte las respuestas en esta pregunta de SO.com ; pueden en la dirección correcta.

¡Ojalá esto ayude!

Jared Harley
fuente
5

Puede usar la función de java que es:

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

De esta forma, en tu db guardas un número.
Este número podría interpretarse de esta manera:

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

En lugar de l en la nueva Fecha (l), debe insertar el número en la columna de la fecha.
Entonces, tienes tu cita.
Por ejemplo, guardo en mi base de datos este número: 1332342462078
Pero cuando llamo al método anterior, tengo este resultado: 21-mar-2012 16.07.42

Marco Gallella
fuente
3

Basado en la respuesta de @ e-satis, creé un método privado en mi clase "DBTools", por lo que agregar la fecha actual ahora es realmente 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);
        }
...

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

Cedric Simon
fuente
1

Funciona para mi perfecto:

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

Guarde su fecha como un largo.

Stefan Beike
fuente
0

Asegúrese de que el campo no esté marcado como 'no nulo' al mismo tiempo que intenta insertar una marca de tiempo predeterminada con la expresión "(DATETIME ('ahora'))"

AlokJoshiOfAarmax
fuente