sqlite. Как создать атрибут типа Date

334
26 декабря 2017, 16:54

Глядя на уроки на просторах интернета вижу, что добавляют данные в базу используя ContentValues. Но конструктора принимающего тип Date там нет. Там небольшой список типов данных.
Я хотел создать таблицу, в которой есть столбец с датой и столбец с текстом. Думал поделить дату на 3 столбца. В одном год, в в другом месяц и в третьем дни. Но мне порекомендовали создать один столбец с атрибутом Date. Но как я понял sqLite не поддерживает подобных типов данных. Хочу уточнить так ли это и как мне лучше поступить, если я создаю таблицу в которой есть разный текст на каждый день в течении нескольких лет.
Есть подозрение, что если добавить дату в таком формате ГГГГ-ММ-ДД в один столбец, то sqlite сможет делать выборку по дате.

Answer 1

Дата в контексте программирования на Java - число миллисекунд после 01.01.1970 00:00 UTC

Именно его и храните в БД для дат. После извлечения из БД объект Date можно получить просто - Date dateFromDb = new Date(longValueFromDb)

Делать все возможные выборки по дате будет просто - вы будете делать выборки не по каким-то строкам в разных столбцах, но по числу в одном столбце.

Answer 2

Не поддержу категоричность ответа @ЮрийСПб

Согласно документации, SQLite, хотя и не имеет специального типа для хранения даты, но, поддерживает хранение даты и манипуляции с ними в одном из 3-х форматов:

1) TEXT как строку ISO8601 ("YYYY-MM-DD HH:MM:SS.SSS").

2) REAL как Юлианский номер дня с 24 ноября, 4714 д.н.э. GMT - согласно пролептическому Григорианскому календарю

3) INTEGER в качестве Unix Time, количество секунд с 1970-01-01 00:00:00 UTC.

Если дата задана в одном из этих 3-х форматов, то поддерживается работа с встроенными в SQLite функциями работы с датами, а также задание в запросах операций >, >=, <, <=, =, between

Отдельно отмечу, что хранение даты в виде строки ISO8601, имеет один небольшой бесплатный бонусик, а именно становится возможным сохранение часового пояса в дате, чего как вы понимаете нет, когда мы храним UNIX time - иногда это важно.

Минусы, конечно же понятны: оверхед в хранении строки и лишние костЫ в конвертации.

READ ALSO
Как обновить один item после изменения в RecyclerView?

Как обновить один item после изменения в RecyclerView?

RecyclerView отображает список CardView с текстом, их можно добавлять и удалятьПроблема вот в чем, я пытаюсь реализовать изменение itema, то есть, на card view по мимо...

220
Подключение к БД Oracle

Подключение к БД Oracle

Есть БД на удаленном сервереПытаюсь подключиться так

290
JavaFX, Рисование на Canvas

JavaFX, Рисование на Canvas

Как рисовать на одном Canvas из разных классов? Проблема в том, что при обращении к canvas из разных классов возвращаются разные ссылки

253