使用BLOB&TEXT时房间出现意外行为

时间:2018-12-12 07:11:33

标签: sqlite unit-testing android-room robolectric

我正在将应用程序的 SQLite 帮助程序迁移到 Room 。基本上,我所做的只是将数据从旧的 SQLite 数据库复制到 Room ,因此,由于架构不匹配,我需要提供迁移。我在 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表中的CourseBLOB类型,在SQL中,您基本上可以将任何内容存储到任何内容中,我希望它会复制BLOB-在weekday中键入CourseTEXTweekday类型键入NewCourse。 好吧,起初我期待由于类型不匹配而导致的一些错误。但是“很幸运”,但并非意料之外,房间没有引发任何异常,它的值为BLOB,并复制为TEXT

我的第一个问题是为什么它起作用?即如何将TEXT的{​​{1}}值复制到我新创建的表中?

我从不关心它,因为它运行良好,直到我用 Robolectic 做了一些测试。 不幸的是,如果我开始使用 Robolectic 进行测试,则会出错。在迁移中复制数据后,当我查询BLOB时,出现SQL错误

NewCourse

因此,我想在这里它将数据复制为android.database.sqlite.SQLiteException: Getting string when column is blob. Row 0, col 10 ,并且在查询BLOB时会抛出异常,因为weekday会调用游标getWeekDay

我的第二个问题是“为什么在用Robolectic进行测试时,由于仅运行该应用程序而无法正常工作?”

我还仅使用不涉及Android的Sql测试了查询,并且在那儿即使getStringBLOB的类型为BLOB,也将weekday复制为NewCourse {1}}符合预期。

1 个答案:

答案 0 :(得分:1)

Robolectric 是针对Android应用程序的测试库。这里的关键词是测试,这意味着不应有任何例外。 Robolectric 向您显示错误,可能是因为某些android设备可能会引发异常,因此您的应用程序将崩溃。尝试在应用程序运行时检查日志。也许您错过了一些警告。