Как вставить значение типа Long в SQLite - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть значение со времени эпохи, подобное этому 1549251913000, я сохраняю это значение в SQLite.Я создаю таблицу следующим образом:

CREATE TABLE TABLE_BOOKMARK (COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, COLUMN_TITLE TEXT, COLUMN_SOURCE TEXT, COLUMN_DATEANDTIME INTEGER, COLUMN_GUID TEXT);

это значение COLUMN_DATEANDTIME, но с типом INTEGER.но когда я беру значение, оно не соответствует тому, что я ожидал.это становится таким -1231280856.Пожалуйста, дайте мне несколько советов, спасибо

Я пробовал это решение , но все еще не соответствует, когда я получаю его из SQLite (кажется, он не работал с моей проблемой)

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Создайте столбец как INTEGER Тип данных поместите LONG значение в INTEGER в столбце

Убедитесь, что при извлечении значения из курсора как LONG

Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
long value = cursor.getLong(0);

Для более подробной информации: SQLite DataType Doc

0 голосов
/ 04 февраля 2019

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

  • Исключением является столбец rowid или псевдоним столбца rowid , такой столбец ДОЛЖЕН хранить целое число.По целому числу это 64-битное целое число со знаком и, следовательно, включает в себя java long .

Сам тип столбца также является гибким, например, CREATE TABLE mytable (mycolumn a_pretty_weird_column_type) допустим (как и LONG),Такие типы преобразуются в соответствии с 5 правилами в сходство столбцов.

Соединение вышеперечисленного с использованием: -

CREATE TABLE IF NOT EXISTS mytable (mycolumn a_pretty_weird_column_type);
DELETE FROM mytable;
INSERT INTO mytable VALUES
  (1549251913000),
    (999999999999999),('Fred'),(x'010203040506070809'),(0.234567),(null),
    ('999999999999999'), -- Note although specified as TEXT as mycolumn is effectively NUMERIC stored as INTEGER
    ('0.234567') -- As above but stored as REAL
;
SELECT 
    *,
    typeof(mycolumn) AS coltype, -- The column type (note as per value not column definition)
    hex(mycolumn) AS as_hex, -- Convert column to a hex representation of the data
    CAST(mycolumn AS TEXT) AS as_text, -- follow rules
    CAST(mycolumn AS INTEGER) AS as_integer,
    CAST(mycolumn AS REAL) AS as_real,
    CAST(mycolumn AS NUMERIC) AS as_numeric,
    CAST(mycolumn AS BLOB) AS as_blob
FROM mytable;

приводит к: -

enter image description here

Библия как таковая Типы данных в SQLite версии 3 .

, но когда я беру значение, оно не совпадает с тем, чтоЯ ожидал.это становится таким -1231280856

Проблема

Таким образом, ваша проблема не имеет ничего общего с типом столбца, не с SQLite как таковым, скорее это связано с использованием курсора getInt метод, вместо getLong метод.


В одном ответе говорится:

Всегда лучше сохранять дату и время вформа текста в sqlite.

Это неверно с точки зрения пространства и, следовательно, в основе эффективности лежит использование числового представления, то есть 64-разрядного целого числа со знаком в соответствии с SQL как понятноSQLite - функции даты и времени - строки времени (максимум 8 байт) даты и времени будут более эффективными, чем хранение 19 байт (с точностью до секунды).

0 голосов
/ 04 февраля 2019

Согласно документации sqlite не имеет класса хранения по умолчанию для даты и времени.Всегда лучше хранить дату и время в виде текста в sqlite.Затем вы можете анализировать их во время выполнения Date, когда захотите их использовать

...