SQLite в Android, добавляющий кавычки для начала и конца строки, похожей на дату - PullRequest
0 голосов
/ 23 марта 2019

Интересная проблема при использовании SQLite в Android. Я вижу несоответствие длины строки и цитирования строки между тем, что хранится в базе данных, и материализованным значением, видимым в Java.

Мы используем ORM под названием SugarORM для запроса к БД, но я отследил код, вызывающий проблемы, во внутреннем android.database.sqlite.SQLiteCursor классе, используемом в SugarORM, в частности, в методе cursor.getString(columnIndex).

У меня есть строка в базе данных, которая является строкой данных ISO 2019-03-25T19:19:39.664Z и хранится в столбце VARCHAR. С помощью DB Browser для SQLite я подтвердил, что длина строки, хранящейся в базе данных, действительно составляет 24 символа. SELECT LENGTH(MyStringColumn) FROM MyTable WHERE ...

Когда я получаю значение этой строки через cursor.getString(columnIndex), она возвращает строку "2019-03-25T19:19:39.664Z". Обратите внимание на ведущие и конечные кавычки. Java сообщает мне, что длина строки составляет 26 символов.

Любое значение, которое я храню в этом столбце и которое не является данными ISO, не имеет такого поведения. Я попытался отследить источник SQLiteCursor назад, но в итоге он оказался родным методом, и на этом мой набор навыков останавливается.

Может кто-нибудь объяснить, что здесь может происходить? Я, вероятно, просто собираюсь обернуть вокруг моих запросов, чтобы избавиться от кавычек, но это все очень озадачивает. Строка даты передается в интерпретатор JavaScript и вызывает сбой при создании объекта Date в JavaScript.

Если это поможет, я повторил поведение как на своем физическом устройстве S7, так и на эмуляторе Pixel 6.

1 Ответ

0 голосов
/ 23 марта 2019

Для быстрого передвижения вы можете использовать: -

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

т.е. Во 2-й строке 2-го столбца извлекается соответствующее значение с помощью функции replace для удаления кавычек, если они существуют.

Относительно того, почему существуют кавычки, может зависеть либо способ вставки данных ( возможно, вы непреднамеренно закодировали кавычки, но рассматриваемая БД не является реальной базой данных, скопированной из приложения ) или способ извлечения данных, который по какой-то причине добавляет их.

Я не думаю, что в методе Cursor getString есть ошибка, при которой добавляются кавычки, в противном случае такая проблема, вероятно, будет повторяющейся.

...