我正在将应用程序的 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
表中的Course
是BLOB
类型,在SQL
中,您基本上可以将任何内容存储到任何内容中,我希望它会复制BLOB
-在weekday
中键入Course
到TEXT
中weekday
类型键入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测试了查询,并且在那儿即使getString
上BLOB
的类型为BLOB
,也将weekday
复制为NewCourse
{1}}符合预期。
答案 0 :(得分:1)
Robolectric 是针对Android应用程序的测试库。这里的关键词是测试,这意味着不应有任何例外。 Robolectric 向您显示错误,可能是因为某些android设备可能会引发异常,因此您的应用程序将崩溃。尝试在应用程序运行时检查日志。也许您错过了一些警告。