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)
}