Як вставити запис 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_create до тепер ? Щоб було зрозуміло,

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

Не є правильним рішенням. Він просто встановлює стовпчик на "datetime (" зараз ")" текст.


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

Відповіді:


194

Ви не можете використовувати функцію часу, використовуючи обгортку 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?
Грег Б

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 Чи можете ви дати більше інформації, я не точно отримую те, що ви сказали.
Rikin Patel

тож вище ви берете об’єкт Date і перетворюєте його на рядок, який слід розмістити в стовпці sqlite .. але коли ви витягуєте цей рядок із бази даних, як ви перетворите його назад в об'єкт Date?
Ерік

1
@erik SimpleDateFormat формат = новий SimpleDateFormat ("yyyy-MM-dd HH: mm: ss"); formatter.parse (created_at);
Сакшам

8

Можна скористатися кількома варіантами:

  1. Ви можете спробувати використати рядок "(DATETIME (" зараз "))".
  2. Вставте дату самостійно, тобто за допомогою System.currentTimeMillis ()
  3. Під час створення таблиці SQLite вкажіть значення за замовчуванням для стовпця create_date як поточний час дати.
  4. Використовуйте SQLiteDatabase.execSQL для вставки безпосередньо.

Номер 1 не працює (принаймні при використанні ContentValuesі update(), він просто поміщає рядок DATETIME('now')в стовпці.
Барт Friederichs

1
Другий має проблеми з часовими поясами. Я вставив запис з a DEFAULT CURRENT_TIMESTAMPі пізніше використовується System.currentTimeMillis()для оновлення. Я бачу різницю в годині.
Барт Фрідеріхс

@sooniln Ви перевірили, що (DATETIME ("зараз")) дійсно вставить поточний час?
ІгорГанапольський

Якщо ви хочете додати місцеву дату, спробуйте скористатись "datetime (" зараз "," localtime ")"
Simon

7

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

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

Ознайомтесь із шанувальниками у цьому питанні SO.com - вони можуть привести вас у правильному напрямку.

Сподіваємось, це допомагає!


5

Ви можете використовувати функцію 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 до нової дати (l) ви повинні вставити номер у стовпець дати.
Отже, у вас є побачення.
Наприклад, я зберігаю у своєму db цей номер: 1332342462078
Але коли я зателефоную вище, я отримаю такий результат: 21-mar-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 ('зараз'))"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.