Как вставить запись SQLite с датой и временем в приложении Android?

93

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

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')" текст.

  • 1
    Одна проблема здесь в том, что Android использует SQLite для БД. Вы можете установить столбец определенного типа, но это просто устанавливает для столбцов «сходство». SQLite позволит вам поместить любое значение в любой столбец независимо от того, как он объявлен. Для SQLite поместить строку 'date' в любое место довольно хорошо. У sqlite.org есть более подробное объяснение. Я голосую за ответ e-satu ниже, вот как я это делаю (особенно способ Java).
Теги:

10 ответов

192

Вы не можете использовать функцию 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);
    
  • 1
    Пожалуйста, переформатируйте код как «Пример кода». В противном случае хороший ответ.
  • 3
    это java.util.Date или java.sql.Date?
Показать ещё 1 комментарий
36

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

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

create table notes (
  _id integer primary key autoincrement, 
  created_date date default CURRENT_DATE
)
  • 2
    Какие типы Java вы используете, когда вы читаете значения?
21

Метод 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 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);
  • 0
    Любопытно, вы можете показать, как вы бы переключили полученную строку обратно в объект DATE?
  • 0
    @erik Можете ли вы дать больше информации, я не совсем понимаю, что вы сказали.
Показать ещё 2 комментария
7

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

  • Вы можете попробовать использовать строку "(DATETIME ('now')) вместо этого.
  • Вставьте дату-время самостоятельно, то есть с помощью System.currentTimeMillis()
  • При создании таблицы SQLite укажите значение по умолчанию для столбца created_date как текущее время.
  • Используйте SQLiteDatabase.execSQL для вставки напрямую.
  • 0
    Номер 1 не работает (по крайней мере, при использовании ContentValues и update() , он просто помещает строку DATETIME('now') в столбец.
  • 1
    У второго проблемы с часовыми поясами. Я вставил запись с DEFAULT CURRENT_TIMESTAMP и позже использовал System.currentTimeMillis() для обновления. Я вижу разницу в часах.
Показать ещё 2 комментария
6

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

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

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

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

4

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

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

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

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

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

2

Основываясь на ответе @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

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

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

1

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

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню