You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

预打包数据库架构无效:字段顺序混乱问题求助

预打包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?
)

问题分析与解决步骤

核心差异点

  1. 字段名大小写/命名不匹配:
    • 实体类的name对应数据库的Name,description对应Description,weight对应Weight,durability对应Durability,friction对应Friction,buoyancy对应Bouyancy(数据库字段拼写少一个u),ItemCategory对应Category。
    • 合成材料数量字段命名顺序相反:实体类是itemCrafting1Amount,数据库是itemCraftingAmount1,其余2/3/4字段同理。
  2. 主键类型与约束不匹配:实体类中id是String类型且非空,数据库中id是INTEGER类型且允许为空。
  3. 字段存在性不一致:
    • 实体类有imgUrl字段,数据库中无此字段。
    • 数据库有ItemID字段,实体类无对应字段。

解决步骤

  1. 统一字段名:
    • 修改实体类的@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?,
      
    • 或反过来修改数据库字段名,与实体类保持一致。
  2. 统一主键类型:
    • 若保留实体类的String类型主键,修改数据库建表语句,将id改为TEXT类型并设置非空:
      "id"    TEXT NOT NULL,
      
    • 若保留数据库的INTEGER主键,将实体类的id改为Int类型:
      @PrimaryKey var id: Int = 0,
      
  3. 同步字段存在性:
    • 若需要imgUrl字段,在数据库中添加该字段:
      "imgUrl"    INTEGER,
      
    • 若不需要ItemID字段,从数据库中删除该字段;若需要,则在实体类中添加对应字段:
      @ColumnInfo(name = "ItemID") var itemId: String?,
      
  4. 重新生成预打包数据库:修改数据库结构后,重新导入250条数据,将新的数据库文件替换assets目录中的旧文件。

内容的提问来源于stack exchange,提问作者BlazeCodeDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:35:20