在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模拟器上复制了行为。
答案 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;
结果为:-
即第二行第二列通过使用 replace 函数删除引号(如果存在)来检索适当的值。
为什么引号存在可能取决于插入数据的方式(也许您不经意地对引号进行了编码,但所查看的数据库不是从应用程序复制的实际数据库)或由于某种原因而检索数据的方式都会添加它们。
我不认为Cursor getString 方法有一个在引号中添加引号的错误,否则这种问题很可能会反复出现。