【发布时间】:2021-08-03 14:21:12
【问题描述】:
我在本地计算机上创建了一个数据库,以将其预填充到 Room 中。数据库位于 Windows 计算机上的 MySQL 本地。但是,我使用 Room 中的 SQL 语句来创建它,并且由于方言的不同,只做了一些必要的小改动。因此,该方案与预期的相同。但是问题是,当我将其转换为 SQLite 时,转换器不关心大小写,而是以小写形式写入所有表名。 (由于 MySQL-Database 对表名不区分大小写。)这会导致 Android 中的数据库方案无效,只是因为外键中的表名是小写的,并且没有以大写字母开头。 这是没有格式化的错误消息(因为它显示得很明显,实际上没有区别):
java.lang.IllegalStateException: Pre-packaged database has an invalid schema: Strengths(bi.deutsch_kirundi_app.db.entities.germanSpecificTables.Strengths).
Expected:
TableInfo{name='Strengths', columns={name=Column{name='name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, singularStrength=Column{name='singularStrength', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, pluralStrength=Column{name='pluralStrength', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[ForeignKey{referenceTable='Strengths', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[singularStrength], referenceColumnNames=[id]}, ForeignKey{referenceTable='Strengths', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[pluralStrength], referenceColumnNames=[id]}], indices=[Index{name='index_Strengths_singularStrength', unique=false, columns=[singularStrength]}, Index{name='index_Strengths_pluralStrength', unique=false, columns=[pluralStrength]}]}
Found:
TableInfo{name='Strengths', columns={name=Column{name='name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, singularStrength=Column{name='singularStrength', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, pluralStrength=Column{name='pluralStrength', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[ForeignKey{referenceTable='strengths', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[pluralStrength], referenceColumnNames=[id]}, ForeignKey{referenceTable='strengths', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[singularStrength], referenceColumnNames=[id]}], indices=[Index{name='index_Strengths_singularStrength', unique=false, columns=[singularStrength]}, Index{name='index_Strengths_pluralStrength', unique=false, columns=[pluralStrength]}]}
这是格式化的版本:
Expected:
TableInfo{
name='Strengths',
columns={
name=Column{name='name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'},
singularStrength=Column{name='singularStrength', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0,
defaultValue='null'},
id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'},
pluralStrength=Column{name='pluralStrength', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0,
defaultValue='null'}},
foreignKeys=[
ForeignKey{referenceTable='Strengths', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[singularStrength],
referenceColumnNames=[id]},
ForeignKey{referenceTable='Strengths', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[pluralStrength],
referenceColumnNames=[id]}],
indices=[
Index{name='index_Strengths_singularStrength', unique=false, columns=[singularStrength]},
Index{name='index_Strengths_pluralStrength', unique=false, columns=[pluralStrength]}]}
Found:
TableInfo{
name='Strengths',
columns={
name=Column{name='name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'},
singularStrength=Column{name='singularStrength', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0,
defaultValue='null'},
id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'},
pluralStrength=Column{name='pluralStrength', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0,
defaultValue='null'}},
foreignKeys=[
ForeignKey{referenceTable='strengths', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[pluralStrength],
referenceColumnNames=[id]},
ForeignKey{referenceTable='strengths', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[singularStrength],
referenceColumnNames=[id]}],
indices=[
Index{name='index_Strengths_singularStrength', unique=false, columns=[singularStrength]},
Index{name='index_Strengths_pluralStrength', unique=false, columns=[pluralStrength]}]}
显然,即使我愿意,我也无法更改外键引用(因为它检测到数据库被操纵)。 所以我的问题是,如果有可能告诉 Room,忽略外键表名中的大小写。 (因为它在创建表语句中也忽略了它) 有些人可能会认为问题在于外键的切换顺序,但是顺序并不重要。已经用另一个表检查过,其中的列是按切换顺序写入的,它工作得非常好。
【问题讨论】:
标签: mysql sqlite schema android-room case-insensitive