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

Room数据库子表Auto Increment不自动生效,为何需用迭代器?

Room中子表的自增字段无法自动递增

自增字段在Room子表中无法自动递增

menuID由API传入,而sectionID和itemID应设置为自动递增。目前功能可以正常运行,但我想了解为何必须使用sectionIterator和itemIterator来为ShopSectionEntity和ShopSectionItemEntity表生成自增条目。

请查看下方的addSubMenu函数


ShopMenuEntity.kt

@Entity(tableName = ShopMenuEntity.TABLE_NAME)
data class ShopMenuEntity(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = COLUMN_ID)
    var menuID: Int = 0,
    var level:Int? = null,
    @ColumnInfo(name = COLUMN_PARENT_ID)
    var parentId: Int = -1,
    var headline: String? = null,
    var styling: String? = null,
) {
    companion object {

        const val TABLE_NAME = "shop_menu_table"
        const val COLUMN_ID = "menu_id"
        const val COLUMN_PARENT_ID = "parentId"

        fun mapHttpResponse(subMenu: ShopMenuResponse,parentId: Int): ShopMenuEntity {
            return ShopMenuEntity(
                menuID = subMenu.id ?: -1,
                level = subMenu.level,
                parentId = parentId,
                headline = subMenu.headline,
                styling = subMenu.styling
            )
        }
    }
}

ShopSectionEntity.kt

@Entity(tableName = ShopSectionEntity.TABLE_NAME,
    foreignKeys = [ForeignKey(
        entity = ShopMenuEntity::class,
        parentColumns = arrayOf(ShopMenuEntity.COLUMN_ID),
        childColumns = arrayOf(ShopSectionEntity.SHOP_MENU_ID),
        onDelete = ForeignKey.CASCADE
    )],
    indices = [Index(ShopSectionEntity.SHOP_MENU_ID)])
data class ShopSectionEntity(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = COLUMN_ID)
    var sectionID: Int= 0,
    @ColumnInfo(name = SHOP_MENU_ID)
    var shopMenuID: Int,
    var order:Int = 0,

    var headline: String? = null,
    var styling: String? = null,
) {

    companion object {
        const val TABLE_NAME = "shop_section_table"
        const val COLUMN_ID = "section_id"
        const val SHOP_MENU_ID = "fk_menu_id"

        fun mapHttpResponse(section:NetworkSection,shopMenuID:Int,autoSectionID:Int,orderIndex:Int):ShopSectionEntity {

            return ShopSectionEntity(
                sectionID = autoSectionID,
                shopMenuID = shopMenuID,
                order = orderIndex,

                headline = section.headline,
                styling = section.styling
            )
        }
    }
}

ShopSectionItemEntity.kt

@Entity(
    tableName = ShopSectionItemEntity.TABLE_NAME,
    foreignKeys = [ForeignKey(
        entity = ShopSectionEntity::class,
        parentColumns = arrayOf(ShopSectionEntity.COLUMN_ID),
        childColumns = arrayOf(ShopSectionItemEntity.SECTION_ID),
        onDelete = ForeignKey.CASCADE
    )],
    indices = [Index(ShopSectionItemEntity.SECTION_ID)]
)
data class ShopSectionItemEntity(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = COLUMN_ID)
    val autoItemID : Int = 0,
    @ColumnInfo(name = SECTION_ID)
    var sectionID: Int,
    @ColumnInfo(name = ITEM_PARENT_MENU_ID)
    var menuID:Int,
    @ColumnInfo(name = ITEM_CHILD_MENU_ID)
    var subMenuID:Int?,

    ) :Serializable {
    companion object {
        const val TABLE_NAME = "shop_section_item_table"
        const val COLUMN_ID = "item_id"
        const val SECTION_ID = "fk_section_id"
        const val ITEM_PARENT_MENU_ID = "item_parent_menu_id"
        const val ITEM_CHILD_MENU_ID = "item_child_menu_id"

        fun mapHttpResponse(item: NetworkItem, sectionID: Int, mID:Int,autoID:Int,itemOrderIndex:Int) = ShopSectionItemEntity(
            autoItemID = autoID,
            sectionID = sectionID,
            menuID = mID,
            subMenuID = item.content?.subMenu?.id,
        )
    }
    fun hasSubMenu() = subMenuID != null
}

编辑:处理Retrofit响应

if (response.isSuccessful && response.body() != null) {
       val body = response.body()

       body?.let {
                shopMenuDao.deleteAll()
                addSubMenu(shopMenuDao, body, -1)// -1 表示顶级父节点
      }     
 } 

AddSubMenu函数

private var itemIterator = 0
private var sectionIterator = 0;
private suspend fun addSubMenu( 
shopMenuDao: NewShopMenuDao,
subMenu: ShopMenuResponse,
parentID: Int) {
   val dbRootMenus = ArrayList<ShopMenuEntity>()
   val dbSections = ArrayList<ShopSectionEntity>()
   val dbShopItems = ArrayList<ShopSectionItemEntity>()

  if(parentID == -1){
    itemIterator = 0
    sectionIterator = 0
  }
  val mSubMenu = ShopMenuEntity.mapHttpResponse(subMenu,parentID)
  dbRootMenus.add(mSubMenu)
  subMenu.sections?.forEachIndexed { sectionIndex, mSection ->
  val sectionEntity = ShopSectionEntity.mapHttpResponse(mSection, mSubMenu.menuID, ++sectionIterator,sectionIndex)
  dbSections.add(sectionEntity)
  mSection.items?.forEachIndexed { itemIndex, mItem ->
  val itemEntity = ShopSectionItemEntity.mapHttpResponse(mItem, sectionEntity.sectionID,mSubMenu.menuID, ++itemIterator,itemIndex)
        dbShopItems.add(itemEntity)
        mItem.content?.subMenu?.let {
            addSubMenu(shopMenuDao, it, itemEntity.autoItemID)
        }
    }
}
   shopMenuDao.insertAllLists(dbRootMenus, dbSections,dbShopItems)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:23:08