Неожиданное поведение комнаты при работе с BLOB & TEXT - PullRequest
0 голосов
/ 12 декабря 2018

Я перевожу вспомогательное средство 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, как и ожидалось.

1 Ответ

0 голосов
/ 17 декабря 2018

Robolectric - это библиотека для тестирования приложений для Android.Ключевое слово здесь - тестирование и тем самым оно не должно быть никаких исключений. Robolectric показывает ошибку, возможно, из-за того, что некоторые устройства Android могут выдавать исключение, поэтому ваше приложение будет аварийно завершать работу.Попробуйте проверить свои журналы во время работы приложения.Может быть, вы пропускаете некоторые предупреждения.

...