Android中的SQLite在带日期的字符串的开头和结尾添加引号

时间:2019-03-22 21:04:10

标签: android sqlite sugarorm

在Android中使用SQLite时出现有趣的问题。我看到字符串长度不一致,并且数据库中存储的内容与Java中显示的物化值之间的字符串引用不一致。

我们正在使用一个称为SugarORM的ORM来查询数据库,但是我已经将有问题的代码追溯到SugarORM中使用的内部android.database.sqlite.SQLiteCursor类,特别是cursor.getString(columnIndex)方法。

我在数据库中有一个字符串,它是一个ISO数据字符串2019-03-25T19:19:39.664Z,存储在VARCHAR列中。我已经使用用于SQLite的数据库浏览器确认,存储在数据库中的字符串的长度确实为24个字符。 SELECT LENGTH(MyStringColumn) FROM MyTable WHERE ...

当我通过cursor.getString(columnIndex)获得此字符串的值时,它将返回字符串"2019-03-25T19:19:39.664Z"。注意前导和尾随引号。 Java向我报告该字符串长26个字符。

我在此列中存储的任何不是ISO数据的值都没有此行为。我尝试追溯SQLiteCursor源,但最终它最终成为了本机方法,而这正是我的技能所在。

有人可以解释这里发生了什么吗?我可能只是在查询周围写一个包装器以除去引号,但这一切都很令人困惑。日期字符串将被馈送到JavaScript解释器,并在创建JavaScript Date对象时导致失败。

如果有帮助,我已经在S7物理设备和Pixel 6模拟器上复制了行为。

1 个答案:

答案 0 :(得分:0)

为了快速解决问题,您可以使用:-

SELECT length(replace(mystringcolumn,'"','')) FROM mytable;

或在使用原始SELECT之前使用:-

UPDATE mytable SET mystringcolumn = replace(mystringcolumn,'"','');
  • 如果这不能解决问题,则出于某种原因,是由代码来检索有问题的数据。

例如考虑:-

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (mystringcolumn VARCHAR);
INSERT INTO mytable VALUES('2019-03-25T19:19:39.664Z'),('"2019-03-25T19:19:39.664Z"');
SELECT length(mystringcolumn), length(replace(mystringcolumn,'"','')) FROM mytable;

结果为:-

enter image description here

即第二行第二列通过使用 replace 函数删除引号(如果存在)来检索适当的值。

为什么引号存在可能取决于插入数据的方式(也许您不经意地对引号进行了编码,但所查看的数据库不是从应用程序复制的实际数据库)或由于某种原因而检索数据的方式都会添加它们。

我不认为Cursor getString 方法有一个在引号中添加引号的错误,否则这种问题很可能会反复出现。