Как вставить запись SQLite с датой и временем, установленной на «сейчас» в приложении для Android?


109

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

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 на now ? Чтобы было понятно,

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

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


1
Одна из проблем здесь в том, что Android использует SQLite для БД. Вы можете установить столбец определенного типа, но это просто задает сродство столбцов. SQLite позволит вам поместить любое значение в любой столбец, независимо от того, как оно объявлено. Для SQLite размещение строки date где угодно - это нормально. sqlite.org предлагает более подробное объяснение. Я голосую за ответ e-satis ниже, вот как я это делаю (в частности, способ Java).
Будет

Ответы:


194

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

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

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • Или возможности Java Date Time:

    // 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);

1
Переформатируйте код как «Образец кода». В противном случае хороший ответ.
Будет

3
это java.util.Date или java.sql.Date?
Greg B

5
java.util.Date, но я уверен, что вы можете сделать это и с датой java.sql.Date.
e-satis

44

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

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

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

32

Способ 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);

Любопытно, не могли бы вы показать, как бы преобразовать полученную строку обратно в объект DATE?
Эрик

@erik Не могли бы вы дать дополнительную информацию, я не совсем понимаю, что вы сказали.
Рикин Патель

Итак, выше вы берете объект Date и конвертируете его в строку, которая будет помещена в столбец sqlite .. но когда вы извлекаете эту строку из базы данных, как вы конвертируете ее обратно в объект Date?
Эрик

1
@erik SimpleDateFormat formatter = новый SimpleDateFormat ("гггг-мм-дд ЧЧ: мм: сс"); formatter.parse (created_at);
Saksham

8

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

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

Номер 1 не работает (по крайней мере, при использовании ContentValuesи update(), он просто помещает строку DATETIME('now')в столбец.
Барт Фридрихс

1
У второго проблемы с часовыми поясами. Я вставил запись с, DEFAULT CURRENT_TIMESTAMPа потом использовал System.currentTimeMillis()для обновления. Я вижу разницу в час.
Bart Friederichs

@sooniln Вы проверили, что (DATETIME ('now')) действительно вставит текущее datetime?
Игорь Ганапольский 08

Если вы хотите добавить местное datetime, попробуйте вместо этого использовать «datetime ('now', 'localtime')»
Саймон

7

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

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

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

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


5

Вы можете использовать функцию 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


3

Основываясь на ответе @ e-satis, я создал частный метод в моем классе "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

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

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

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



0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.