Как вставить запись SQLite с датой и временем в приложении Android? - PullRequest
105 голосов
/ 16 апреля 2009

Скажем, у нас есть таблица, созданная как:

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

Чтобы вставить запись, я бы использовал

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

Но как установить для столбца date_created значение сейчас ? Чтобы было понятно,

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

Не правильное решение. Он просто устанавливает в столбце текст "datetime ('now')".

Ответы [ 10 ]

187 голосов
/ 04 мая 2009

Вы не можете использовать функцию datetime, используя оболочку Java "ContentValues". Либо вы можете использовать:

  • SQLiteDatabase.execSQL, чтобы вы могли ввести необработанный SQL-запрос.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
    
  • Или возможности даты и времени 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);
    
40 голосов
/ 21 марта 2010

В моем коде я использую DATETIME DEFAULT CURRENT_TIMESTAMP в качестве типа и ограничения столбца.

В вашем случае определение вашей таблицы будет

create table notes (
  _id integer primary key autoincrement, 
  created_date date default CURRENT_DATE
)
27 голосов
/ 09 ноября 2014

Метод 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
);

Метод 2

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

Метод 3 Использование функций даты 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);
7 голосов
/ 16 апреля 2009

Есть несколько вариантов, которые вы можете использовать:

  1. Вместо этого вы можете попробовать использовать строку "(DATETIME ('now'))".
  2. Вставьте дату и время самостоятельно, т.е. с помощью System.currentTimeMillis ()
  3. При создании таблицы SQLite укажите значение по умолчанию для столбца созданного_дата в качестве текущей даты.
  4. Используйте SQLiteDatabase.execSQL для прямой вставки.
6 голосов
/ 16 апреля 2009

Мне кажется, проблема в том, что вы посылаете "datetime('now')" в виде строки, а не значения.

Моя мысль состоит в том, чтобы найти способ получить текущую дату / время и отправить его в вашу базу данных в качестве значения даты / времени, или найти способ использовать встроенный в SQLite (DATETIME('NOW')) параметр

Проверьте ответы на этот вопрос SO.com - они могут привести вас в правильном направлении.

Надеюсь, это поможет!

4 голосов
/ 21 марта 2012

Вы можете использовать функцию Java, которая:

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

Таким образом, в вашей БД вы сохраняете число.
Это число можно интерпретировать следующим образом:

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

Вместо l в новую дату (l) вы должны вставить число в столбец даты.
Итак, у вас свидание.
Например я сохраняю в моей БД этот номер: 1332342462078
Но когда я вызываю метод выше, я получаю такой результат: 21 марта 2012 г. 16.07.42

2 голосов
/ 27 февраля 2014

Основываясь на ответе @ e-sat, я создал приватный метод для своего класса DBTools, поэтому добавление текущей даты теперь действительно легко:

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

Используйте это сейчас так: values.put("lastUpdate", getNow());

1 голос
/ 12 марта 2013

Этот пример кода может делать то, что вы хотите:

http://androidcookbook.com/Recipe.seam?recipeId=413

1 голос
/ 05 августа 2012

У меня отлично работает:

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

Сохраните дату как длинную.

0 голосов
/ 03 октября 2017

Убедитесь, что поле не помечено как «не нулевое» одновременно с попыткой вставить метку времени по умолчанию с помощью выражения «(DATETIME ('now'))» "

...