INERFACE:

@Dao
interface ProductDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertProducts(dataUser: ArrayList<Products>)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertVariants(dataUser: Variants)
}

我想替换旧产品列表并插入新产品列表,即使新旧产品列表的主键不同

产品实体:

@Entity(tableName = "Product")
data class Products (

  @PrimaryKey(autoGenerate = false)
  @ColumnInfo(name = "id")
  var id : Int = 0,
 
  @ColumnInfo(name = "image")
  var image: String? = null,

  @ColumnInfo(name = "other_images")
  var other_images: List<String>  = listOf(),

  @ColumnInfo(name = "variants")
  var variants : List<Variants> = listOf()

)

可变实体:

@Entity(tableName = "Variant",
        foreignKeys = [
        ForeignKey(
          entity = Products::class,
          parentColumns = arrayOf("id"),
          childColumns = arrayOf("product_id"),
          onDelete = ForeignKey.CASCADE
        )
])
data class Variants (

  @PrimaryKey(autoGenerate = false)
  @ColumnInfo(name = "id")
  var id : Int  = 0,

  @ColumnInfo(name = "product_id", index = true)
  var product_id : String?  = null,

  @ColumnInfo(name = "stock")
  var stock : String?  = null,

  @ColumnInfo(name = "varient_status")
  var varient_status : String?  = null,

  @ColumnInfo(name = "measurement_unit_name")
  var measurement_unit_name : String?  = null,

  @ColumnInfo(name = "stock_unit_name")
  var stock_unit_name : String?  = null,

  @ColumnInfo(name = "cart_count")
  var cart_count : String?  = null,

)

产品与变量的关系:

data class ProductWithVariants(
    @Embedded val product: Products,
    @Relation(
        parentColumn = "id",
        entityColumn = "product_id"
    )
    val variants: MutableList<Variants>
)

这是我删除Product表和Variant表中的旧记录的区域,需要将新记录添加到表中,并需要在Receierview中显示它.

视图模型成功响应:

fun productlist() = viewModelScope.launch(Dispatchers.IO) {
    productist.collectLatest {
        when(it) {
            Resource.Empty -> {
                Log.e("catdata",""+"empty")
            }
            is Resource.Failure -> {
                Log.e("catdata",""+"failure")
            }
            Resource.Loading -> {

            }
            is Resource.Success -> {
                val response = it.value
                productsDao.deleteAllProducts()
                productsDao.insertProducts(response.data)
                for (i in 0 until response.data.size) {
                    val product: Products = response.data.get(i)
                    for (j in 0 until product.variants.size) {
                        val variants: Variants = product.variants.get(j)
                        productsDao.insertVariants(variants)
                    }
                }
            }
        }
    }
}

我过go 调用视图模型并使用Kotlin Flow从PagingSource获得响应的Main活动:

 val adapter = ProductListAdapter()
        binding.ProductRecyclerView.adapter = adapter.withLoadStateFooter(ProductLoadStateAdapter())

        lifecycleScope.launch {
            productviewModel.data.collectLatest {
                adapter.submitData(it)
            }
        }
        binding.apply {
            subcatone.setOnClickListener {
                Log.e("test", "checkone")
                viewModel.getproductlist("218")
            }
            subcattwo.setOnClickListener {
                Log.e("test", "checktwo")
                viewModel.getproductlist("217")
            }
        }

这是从MainActivity调用数据库的视图模型:

@HiltViewModel
class productViewModel @Inject constructor(val productsDao: ProductDao) : ViewModel() {

    val data = Pager(PagingConfig(pageSize = 20, enablePlaceholders = false, initialLoadSize = 20)) {
        ProductPagingSource(productsDao)
    }.flow.cachedIn(viewModelScope)
}

推荐答案

您需要删除旧数据,然后重新插入新数据.

@Dao
interface ProductDao {

    ...

    
    @Query("DELETE FROM PRODUCTS")
    suspend fun deleteAllProducts()
}

在插入新项目之前,请删除旧项目:

val dao = //....
scope.launch {
    // first delete the items
    dao.deleteAllProducts()

    // insert new items
    dao.insertProducts(...)

}

Android相关问答推荐

在Android中点击滑动时触发的手势

显示本地房间数据库中未保存的项目的动态列表

Android Gradle/Groovy,如何将文件复制到APK

如何共享没有';t是否存在?(仅信息)在Android?

当提供非状态对象时,compose 如何进行重组

Android kotlin 中闪屏 API 执行完成后如何根据身份验证将用户导航到特定屏幕

块不起作用,出现 "只有安全的 (?.)... " 错误

需要在按钮 onclick 上从 string.xml 获取值. @Composable 调用只能在@Composable 函数的上下文中发生

Kotlin 协程、 retrofit 、android

Material 3 中的 ModalBottomSheet 用于 compose

在 Jetpack Compose 的无状态 Compose 中管理条件逻辑

在移动设备上看到时如何增加 PasswordField 文本?

Jetpack 将 Grid 与基于大小的自适应列数组合在一起

Android:appcompat 和 material 如何从默认创建 appcompat 和 material 视图?

我的 React Native 在 11 月 4 日之前运行良好,但现在在运行 yarn android 时抛出异常

如何为具有不同屏幕尺寸但相同密度的手机创建响应式布局?

单击登录按钮后从应用程序中退出

Android - 水平(从右到左)圆形背景 colored颜色 过渡

Jetpack Compose 中的按钮上的文本未更新

我可以在不解密的情况下使用 JSch 获取加密的 SSH 私钥的类型或 fingerprint 吗?