上面代码 中,在添加 新衣服 和图片时,此时是一起添加的,衣服 还没有生成clothesId,怎么同时添加 该衣服 对应的图片?请优化上面的代码
时间: 2024-10-11 15:16:24 浏览: 4
在原始代码中,由于`Clothes`还未生成`id`,所以在添加图片时无法直接关联。为了优化这个过程,我们可以采用一个异步的方式或者先保存`Clothes`然后获取`id`再保存`ClothesImg`。这里是修改后的版本:
```kotlin
@Dao
interface ClothingDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertClothes(clothes: MutableList<Clothes>, callback: (List<Int>) -> Unit = {})
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertClothesImg(clothesImg: MutableList<ClothesImg>)
// ...其他方法
// 创建一个辅助函数用于获取新Clothes的id
private suspend fun insertAndRetrieveClothesId(name: String): Int {
val newClothes = Clothes(name = name)
insertClothes(listOf(newClothes))
return newClothes.id
}
}
// 更新添加衣服和图片的方法
fun addClothesWithImages(name: String, images: List<String>) {
GlobalScope.launch {
val clothesId = clothingDatabase.clothingDao().insertAndRetrieveClothesId(name)
val clothesToInsert = mutableListOf<Clothes>()
val imagesToInsert = mutableListOf<ClothesImg>()
clothesToInsert.add(Clothes(id = clothesId, name = name))
for (image in images) {
imagesToInsert.add(ClothesImg(clothesId = clothesId, imageUrl = image))
}
clothingDatabase.clothingDao().insertClothes(clothesToInsert) // 同时插入衣服
clothingDatabase.clothingDao().insertClothesImg(imagesToInsert) // 分别插入图片
}
}
// 删除部分不变
```
在这个优化版本中,我们创建了一个内部函数`insertAndRetrieveClothesId`用于异步插入并获取新`Clothes`的ID。接着在`addClothesWithImages`中,先发起衣物的异步插入,拿到ID后再同步插入图片,这样即便衣物尚未生成ID,也能保证图片关联到正确的衣物。