Интересная проблема при использовании 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.