预打包数据库架构无效:字段顺序混乱问题求助
预打包Room数据库架构不匹配问题
错误信息
Expected: TableInfo{name='Item', columns={tradingItem3Amount=Column{name='tradingItem3Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting2Amount=Column{name='itemCrafting2Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, description=Column{name='description', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting4Amount=Column{name='itemCrafting4Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, buoyancy=Column{name='buoyancy', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, ItemCategory=Column{name='ItemCategory', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem1Amount=Column{name='tradingItem1Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting3=Column{name='itemCrafting3', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting4=Column{name='itemCrafting4', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting1=Column{name='itemCrafting1', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting2=Column{name='itemCrafting2', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCraftingAmount=Column{name='itemCraftingAmount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1, defaultValue='null'}, durability=Column{name='durability', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, weight=Column{name='weight', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, friction=Column{name='friction', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting3Amount=Column{name='itemCrafting3Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, imgUrl=Column{name='imgUrl', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem1=Column{name='tradingItem1', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem2=Column{name='tradingItem2', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem3=Column{name='tradingItem3', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, name=Column{name='name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, flammable=Column{name='flammable', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting1Amount=Column{name='itemCrafting1Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem2Amount=Column{name='tradingItem2Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, modpack=Column{name='modpack', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, extraInfo=Column{name='extraInfo', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingAmount=Column{name='tradingAmount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]} Found: TableInfo{name='Item', columns={Category=Column{name='Category', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Description=Column{name='Description', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem3Amount=Column{name='tradingItem3Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Name=Column{name='Name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem1Amount=Column{name='tradingItem1Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting3=Column{name='itemCrafting3', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting4=Column{name='itemCrafting4', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting1=Column{name='itemCrafting1', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCrafting2=Column{name='itemCrafting2', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCraftingAmount=Column{name='itemCraftingAmount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, defaultValue='null'}, itemCraftingAmount1=Column{name='itemCraftingAmount1', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCraftingAmount2=Column{name='itemCraftingAmount2', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCraftingAmount3=Column{name='itemCraftingAmount3', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, itemCraftingAmount4=Column{name='itemCraftingAmount4', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Durability=Column{name='Durability', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Flammable=Column{name='Flammable', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Bouyancy=Column{name='Bouyancy', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, ItemID=Column{name='ItemID', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Weight=Column{name='Weight', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem1=Column{name='tradingItem1', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem2=Column{name='tradingItem2', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem3=Column{name='tradingItem3', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Friction=Column{name='Friction', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingItem2Amount=Column{name='tradingItem2Amount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, modpack=Column{name='modpack', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, extraInfo=Column{name='extraInfo', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, tradingAmount=Column{name='tradingAmount', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
建表语句
CREATE TABLE "Item" ( "id" INTEGER, "Name" TEXT, "ItemID" TEXT, "Category" TEXT, "Description" TEXT, "Weight" INTEGER, "Durability" INTEGER, "Friction" INTEGER, "Bouyancy" INTEGER, "Flammable" INTEGER, "itemCrafting1" TEXT, "itemCraftingAmount1" INTEGER, "itemCrafting2" TEXT, "itemCraftingAmount2" INTEGER, "itemCrafting3" TEXT, "itemCraftingAmount3" INTEGER, "itemCrafting4" TEXT, "itemCraftingAmount4" INTEGER, "extraInfo" TEXT, "itemCraftingAmount" INTEGER, "tradingAmount" INTEGER, "tradingItem1" TEXT, "tradingItem1Amount" INTEGER, "tradingItem2" TEXT, "tradingItem2Amount" INTEGER, "tradingItem3" TEXT, "tradingItem3Amount" INTEGER, "modpack" TEXT, PRIMARY KEY("id") )
Item.kt实体类代码
package com.blazecode.scrapguidev2.ui.items import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import com.blazecode.scrapguidev2.ui.items.enums.Modpack import com.blazecode.scrapguidev2.ui.items.enums.ItemCategory @Entity data class Item( @PrimaryKey var id: String = "0", @ColumnInfo(name = "name") var name: String?, @ColumnInfo(name = "imgUrl") var imgUrl: Int?, @ColumnInfo(name = "ItemCategory") var category: ItemCategory?, @ColumnInfo(name = "description") var description: String?, @ColumnInfo(name = "weight") var weight: Int?, @ColumnInfo(name = "durability") var durability: Int?, @ColumnInfo(name = "friction") var friction: Int?, @ColumnInfo(name = "buoyancy") var buoyancy: Int?, @ColumnInfo(name = "flammable") var flammable: Boolean?, @ColumnInfo(name = "itemCrafting1") var itemCrafting1: String?, @ColumnInfo(name = "itemCrafting2") var itemCrafting2: String?, @ColumnInfo(name = "itemCrafting3") var itemCrafting3: String?, @ColumnInfo(name = "itemCrafting4") var itemCrafting4: String?, @ColumnInfo(name = "itemCrafting1Amount") var itemCrafting1Amount: Int?, @ColumnInfo(name = "itemCrafting2Amount") var itemCrafting2Amount: Int?, @ColumnInfo(name = "itemCrafting3Amount") var itemCrafting3Amount: Int?, @ColumnInfo(name = "itemCrafting4Amount") var itemCrafting4Amount: Int?, @ColumnInfo(name = "extraInfo") var extraInfo: String?, @ColumnInfo(name = "itemCraftingAmount") var itemCraftingAmount: Int?, @ColumnInfo(name = "tradingAmount") var tradingAmount: Int?, @ColumnInfo(name = "tradingItem1") var tradingItem1: String?, @ColumnInfo(name = "tradingItem1Amount") var tradingItem1Amount: Int?, @ColumnInfo(name = "tradingItem2") var tradingItem2: String?, @ColumnInfo(name = "tradingItem2Amount") var tradingItem2Amount: Int?, @ColumnInfo(name = "tradingItem3") var tradingItem3: String?, @ColumnInfo(name = "tradingItem3Amount") var tradingItem3Amount: Int?, @ColumnInfo(name = "modpack") var modpack: Modpack? )
问题分析与解决步骤
核心差异点
- 字段名大小写/命名不匹配:
- 实体类的
name对应数据库的Name,description对应Description,weight对应Weight,durability对应Durability,friction对应Friction,buoyancy对应Bouyancy(数据库字段拼写少一个u),ItemCategory对应Category。 - 合成材料数量字段命名顺序相反:实体类是
itemCrafting1Amount,数据库是itemCraftingAmount1,其余2/3/4字段同理。
- 实体类的
- 主键类型与约束不匹配:实体类中
id是String类型且非空,数据库中id是INTEGER类型且允许为空。 - 字段存在性不一致:
- 实体类有
imgUrl字段,数据库中无此字段。 - 数据库有
ItemID字段,实体类无对应字段。
- 实体类有
解决步骤
- 统一字段名:
- 修改实体类的
@ColumnInfo注解,使其完全匹配数据库字段名,例如:@ColumnInfo(name = "Name") var name: String?, @ColumnInfo(name = "Category") var category: ItemCategory?, @ColumnInfo(name = "Description") var description: String?, @ColumnInfo(name = "Weight") var weight: Int?, @ColumnInfo(name = "Bouyancy") var buoyancy: Int?, @ColumnInfo(name = "itemCraftingAmount1") var itemCrafting1Amount: Int?, - 或反过来修改数据库字段名,与实体类保持一致。
- 修改实体类的
- 统一主键类型:
- 若保留实体类的
String类型主键,修改数据库建表语句,将id改为TEXT类型并设置非空:"id" TEXT NOT NULL, - 若保留数据库的
INTEGER主键,将实体类的id改为Int类型:@PrimaryKey var id: Int = 0,
- 若保留实体类的
- 同步字段存在性:
- 若需要
imgUrl字段,在数据库中添加该字段:"imgUrl" INTEGER, - 若不需要
ItemID字段,从数据库中删除该字段;若需要,则在实体类中添加对应字段:@ColumnInfo(name = "ItemID") var itemId: String?,
- 若需要
- 重新生成预打包数据库:修改数据库结构后,重新导入250条数据,将新的数据库文件替换assets目录中的旧文件。
内容的提问来源于stack exchange,提问作者BlazeCodeDev
相关产品推荐
相关产品推荐

