【问题标题】:How to insert Long Type value to SQLite如何将长类型值插入 SQLite
【发布时间】:2019-06-27 19:46:56
【问题描述】:

我有一个像 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。 请给我一些建议,谢谢

我已经尝试过这个solution,但当我从 SQLite 获取它时仍然不匹配(似乎它不适用于我的问题)

【问题讨论】:

  • INTEGERSqlite 中的数字类型。卸载应用后你试过了吗?
  • 我试过了,还是不行
  • 设置成INTEGER类型没有问题吗? (当我用整数类型的日期和时间列创建表时)

标签: android android-sqlite


【解决方案1】:

INTEGER 数据类型中创建一个列,将LONG 值放入列中的INTEGER

确保从光标中检索值时为LONG

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

更多:SQLite DataType Doc

【讨论】:

  • SQLite 中是否存在 LONG,我认为它只有 INTEGER
  • SQLite 中不只存在 INTEGER 以获取更多信息,请访问答案中提到的 SQLite 文档
【解决方案2】:

只是为了澄清列类型,除了一个例外,在很大程度上无关紧要,因为任何类型的数据都可以存储在任何类型的列中。

  • 例外是 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;

结果:-

圣经本身就是Datatypes In SQLite Version 3

但是当我取值时,它与我的预期不符。它 变成这样-1231280856

问题

因此,您的问题与列类型无关,与 SQLite 本身无关,而是由于使用 Cursor getInt 方法而不是 getLong 方法.


一个回答说,

在 sqlite 中以文本形式存储日期和时间总是更好。

这是不正确的,从空间的角度来看,因此使用数字表示的基本效率,即日期和时间的 64 位有符号整数 SQL As Understood By SQLite - Date And Time Functions - Time Strings(最多 8 个字节)将更有效而不是存储 19 个字节(精确到一秒)。

【讨论】:

    【解决方案3】:

    根据文档,sqlite 没有日期和时间的默认存储类。在 sqlite 中以文本形式存储日期和时间总是更好。然后,您可以随时将它们解析为 Date 运行时

    【讨论】:

    • 我会把它放在最后一个解决方案中
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2022-07-21
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多