Como inserir um registro SQLite com uma data e hora definida como 'agora' no aplicativo Android?

109

Digamos, temos uma tabela criada como:

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

Para inserir um registro, eu usaria

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

Mas como definir a coluna date_created para agora ? Para deixar claro, o

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

Não é a solução certa. Ele apenas define a coluna para o texto "datetime ('now')".

droidguy
fonte
1
Um problema aqui é que o Android usa SQLite para o banco de dados. Você pode definir uma coluna para um determinado tipo, mas isso apenas define a 'afinidade' das colunas. SQLite permitirá que você coloque qualquer valor em qualquer coluna, independentemente de como ele é declarado. Para o SQLite, colocar a string 'data' em qualquer lugar está bem. sqlite.org tem uma explicação mais completa. Estou votando na resposta do e-satis abaixo, é assim que eu faço (especificamente do jeito Java).
Será

Respostas:

194

Você não pode usar a função datetime usando o wrapper Java "ContentValues". Você pode usar:

  • SQLiteDatabase.execSQL para que você possa inserir uma consulta SQL bruta.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • Ou os recursos de data e 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);
e-satis
fonte
1
Reformate o código como 'Amostra de código'. Caso contrário, boa resposta.
Será
3
isso é java.util.Date ou java.sql.Date?
Greg B
5
java.util.Date, mas tenho certeza que você também pode fazer isso com java.sql.Date date.
e-satis
44

No meu código eu uso DATETIME DEFAULT CURRENT_TIMESTAMP como tipo e restrição da coluna.

No seu caso, a definição da sua mesa seria

create table notes (
  _id integer primary key autoincrement, 
  created_date date default CURRENT_DATE
)
Gautier Hayoun
fonte
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 usando funções 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
fonte
Curioso, você pode mostrar como você mudaria a string resultante de volta para um objeto DATE?
Erik
@erik Você pode dar mais informações, não estou entendendo exatamente o que você disse.
Rikin Patel
Portanto, acima você está pegando um objeto Date e convertendo-o em uma string para ser colocada em uma coluna sqlite ... mas quando você puxa essa string do banco de dados, como você a converte de volta em um objeto Date?
erik
1
@erik SimpleDateFormat formatter = new SimpleDateFormat ("aaaa-MM-dd HH: mm: ss"); formatter.parse (created_at);
Saksham
8

Existem algumas opções que você pode usar:

  1. Você pode tentar usar a string "(DATETIME ('agora'))".
  2. Insira a data e hora você mesmo, ou seja, com System.currentTimeMillis ()
  3. Ao criar a tabela SQLite, especifique um valor padrão para a coluna created_date como a data e hora atual.
  4. Use SQLiteDatabase.execSQL para inserir diretamente.
logo
fonte
O número 1 não funciona (pelo menos não ao usar ContentValuese update(), ele apenas coloca a string DATETIME('now')na coluna.
Bart Friederichs
1
O segundo tem problemas com fusos horários. Inseri um registro com um DEFAULT CURRENT_TIMESTAMPe depois usei System.currentTimeMillis()para atualizar. Eu vejo uma diferença de hora.
Bart Friederichs
@sooniln Você verificou que (DATETIME ('agora')) irá realmente inserir a data e hora atual?
IgorGanapolsky
Se você deseja adicionar data e hora local, tente usar "data e hora ('agora', 'hora local')" em vez disso
Simon
7

Para mim, o problema parece que você está enviando "datetime('now')"como uma string, em vez de um valor.

Meu pensamento é encontrar uma maneira de pegar a data / hora atual e enviá-la para o seu banco de dados como um valor de data / hora, ou encontrar uma maneira de usar o (DATETIME('NOW'))parâmetro embutido do SQLite

Confira as respostas nesta questão SO.com - elas podem levar você na direção certa.

Espero que isso ajude!

Jared Harley
fonte
5

Você pode usar a função de java que é:

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

Desta forma, em seu banco de dados você salva um número.
Este número pode ser interpretado da seguinte maneira:

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

Em vez de l na nova data (l), você deve inserir o número na coluna de data.
Então, você tem seu encontro.
Por exemplo, eu salvo no meu banco de dados este número: 1332342462078
Mas quando eu chamo o método acima eu tenho este resultado: 21-mar-2012 16.07.42

Marco Gallella
fonte
3

Com base na resposta @ e-satis, criei um método privado na minha classe "DBTools", então adicionar a data atual agora é muito 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);
        }
...

Use agora assim: values.put("lastUpdate", getNow());

Cedric Simon
fonte
1

Funciona perfeitamente para mim:

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

Salve sua data como um longo.

Stefan Beike
fonte
0

Certifique-se de que o campo não esteja marcado como 'não nulo' ao mesmo tempo em que você está tentando inserir um carimbo de hora padrão usando a expressão "(DATETIME ('now'))"

AlokJoshiOfAarmax
fonte