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
相关产品推荐
相关产品推荐

