Я перевожу вспомогательное средство SQLite моего приложения в Комнату .По сути, я просто копирую данные из старой SQLite базы данных в Room , поэтому из-за несоответствия схемы мне нужно обеспечить миграцию.У меня проблема с BLOB-данными в Комнате .У меня ниже простая модель
class NewCourse {
var weekday: Array<String> = arrayOf()
}
У меня также есть TypeConverter
как
@TypeConverter
fun toArray(concatenatedStrings: String?): Array<String>? {
return concatenatedStrings?.split(",".toRegex())?.dropLastWhile { it.isEmpty() }?.toTypedArray()
}
@TypeConverter
fun fromArray(strings: Array<String>?): String? {
return strings?.joinToString(",")
}
В моей старой базе данных appdatabase.db
у меня есть соответствующая таблица Course
с полем weekday
который имеет тип BLOB
.
Ну, из-за моей TypeConverter
в базе данных комнаты у меня будет weekday
с типом TEXT
.Во время миграции я запускаю ниже сценарий SQL
.
INSERT INTO NewCourse (weekday) SELECT weekday FROM Course
Поскольку weekday
из Course
таблицы имеет тип BLOB
, а в SQL
вы можете в основном хранить все что угодно, ожидаю ли я этогоскопирует BLOB
-тип weekday
в Course
в TEXT
-тип weekday
в NewCourse
.Ну, сначала я ожидал какую-то ошибку из-за несоответствия типов.Но «к счастью», но не ожидалось, Комната не выдает никаких исключений, и получает значение BLOB
и копирует как TEXT
.
Мой первый вопрос был, почему этоза работой?то есть как он копирует TEXT
значение BLOB
в мою только что созданную таблицу?
Я никогда не заботился об этом, так как он работал отлично, пока я не провел некоторое тестирование с Robolectic ,К сожалению, я получаю ошибку, если начинаю тестирование с Robolectic .После копирования данных в моей миграции, когда я запрашиваю NewCourse
, я получаю ошибку SQL, равную
android.database.sqlite.SQLiteException: Getting string when column is blob. Row 0, col 10
Итак, я предполагаю, что здесь происходит копирование данных как BLOB
и при запросе weekday
это вызывает исключение, так как getWeekDay
вызывает getString
курсора.
Мой второй вопрос будет звучать так: «Почему во время тестирования с Robolectic оно не работает, а работает только с запуском приложения?»
Я также тестировал запросы только на Sql, не включающем Android,и там он копирует BLOB
как BLOB
, хотя тип weekday
в NewCourse
равен TEXT
, как и ожидалось.