我要删除一对多关系中的所有值

父表:

@Entity(tableName = "Product")  
data class Products (  
  @PrimaryKey(autoGenerate = false)  
  @ColumnInfo(name = "id") var id : Int = 0,   
  @ColumnInfo(name = "name")
  var name  : String? = null,   
  @ColumnInfo(name = "category_id")
  var category_id : String? = null,  
  @ColumnInfo(name = "subcategory_id")
  var subcategory_id : String? = null,  
  @ColumnInfo(name = "other_images")
  var other_images: List<String>  = listOf(),  
  @ColumnInfo(name = "price")
  var price : String? = null,  
  @ColumnInfo(name = "variants")
  var variants : List<Variants> = listOf()  
)

子表:

@Entity(tableName = "Variant")  
data class Variants (  
  @PrimaryKey(autoGenerate = false)  
  @ColumnInfo(name = "id")
  var id : Int  = 0,  
  @ColumnInfo(name = "product_id")
  var product_id : String?  = null,  
  @ColumnInfo(name = "price")
  var price : String?  = null,   
  @ColumnInfo(name = "discounted_price")
  var discounted_price : String?  = null,   
  @ColumnInfo(name = "image")
  var image : String?  = null,   
  @ColumnInfo(name = "moq")
  var moq : String?  = null,   
  @ColumnInfo(name = "cart_count")
  var cart_count : String?  = null,   
  @ColumnInfo(name = "is_notify_me")
  var is_notify_me : Boolean? = null             
)

关系:

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

简单地说...我想要delete all products and variantsDelete Single Product with corresponding variantsUpdate Single Product

关系有什么变化吗??我还需要在岛上查询!!

推荐答案

您应该使用ForeignKey来指定实体之间的关系.

正如文档所说:

外键允许您指定跨实体的约束,如 该SQLite将确保在您修改时关系有效 数据库.

要添加外键,请执行以下操作:

  1. 父类
@Entity
data class User(
    @PrimaryKey
    val userId: Int,
    val name: String
)
  1. children 班:
@Entity(
    foreignKeys = [
        ForeignKey(
            entity = User::class,
            parentColumns = arrayOf("userId"),
            childColumns = arrayOf("ownerUserId"),
            onDelete = ForeignKey.CASCADE
        )
    ]
)
data class Pet(
    @PrimaryKey
    val petId: Int,
    val name: String,
    @ColumnInfo(index = true)
    val ownerUserId: Int
)
  1. 定义对象之间的关系:
data class UserWithPets (
    @Embedded
    val user: User,
    @Relation(
        parentColumn = "userId",
        entityColumn = "ownerUserId"
    )
    val pets: List<Pet>
)
  1. 创建DAO:
@Dao
interface UserDao {
    @Insert
    suspend fun saveUser(user: User)

    @Insert
    suspend fun saveUsers(users: List<User>)

    @Insert
    suspend fun savePets(pets: List<Pet>)

    @Query("SELECT * FROM USER")
    suspend fun getUsers(): List<UserWithPets>

    @Query("DELETE FROM USER WHERE userId=:id")
    suspend fun deleteUser(id: Int)

    @Query("DELETE FROM USER")
    suspend fun deleteAllUsers()

    @Update
    suspend fun updatePet(pet: Pet)
}

Some example queries:

// Add new user
 val user = User(userId = 1, name = "User1")
 userDao.saveUser(user)

 var userWithPets = userDao.getUsers()
// result -> UserWithPets(user=User(userId=1, name=User1), pets=[])

// Add new pet
 val pet = Pet(petId = 1, ownerUserId = 1, name = "Pet Name")
 userDao.savePets(listOf(pet))

// Fetch users again
//UserWithPets(user=User(userId=1, name=User1), pets=[Pet(petId=1, name=Pet Name, ownerUserId=1)])

 
// Update pet
userDao.updatePet(pet.copy(name = "New Name"))

// Fetch users again
//UserWithPets(user=User(userId=1, name=User1), pets=[Pet(petId=1, name=New Name, ownerUserId=1)])

这样,无论何时删除User,它的所有Pets都将自动删除.

Android相关问答推荐

我遇到了一个HashMaps对象没有存储在Firebase数据库中的问题.HashMap的一个对象put方法未被存储

Android编写动画在发布版本中崩溃

Android配置设置. gradle不同应用风格

我如何剪裁一个可由另一个合成的

数据绑定在Android中等待填充值时显示未填充的值

android回收器查看点击事件无响应

activity在 Runnable 中如何工作?我的 Android 表格未显示

Android Studio Relay插件(版本0.3.07)错误

Gradle在我的Android Compose项目中继续推广依赖版本

修复报错 RecyclerView: No adapter attached;跳过布局

在单元测试下断言协程未完成

Android AGP 8 + Gradle 8 + Kotlin 1.8 导致 Kapt 出错

如何像 XML 一样在 Compose Android Studio 中折叠/展开小部件代码区域/区域

如何在 Jetpack Compose 中添加多个标签

如何关闭可组合对话框?

Android活动系统导航栏 colored颜色 ?

如何使用 Kotlin Coroutines 正确地拥有待处理的操作队列?

在 jetpack compose 中使用 .shadow 和 Button 会导致问题

不能在kotlin的lazycolumn中使用列表

Android Gridlayout 没有显示其中没有任何视图的框架布局