android - 删除一对多关系 Room Kotlin 中的所有值

标签 android kotlin one-to-many android-room-relation

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

父表:

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

简单地..我想删除所有产品和变体删除具有相应变体的单个产品更新单个产品

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

最佳答案

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

正如文档所述:

Foreign keys allow you to specify constraints across Entities such that SQLite will ensure that the relationship is valid when you modify the database.

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

  1. 父类
@Entity
data class User(
    @PrimaryKey
    val userId: Int,
    val name: String
)
  • 子级:
  • @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
    )
    
  • 定义对象之间的关系:
  • data class UserWithPets (
        @Embedded
        val user: User,
        @Relation(
            parentColumn = "userId",
            entityColumn = "ownerUserId"
        )
        val pets: List<Pet>
    )
    
  • 创建 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)
    }
    

    一些示例查询:

    // 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)])
    
    

    这样,每当您删除用户时,其所有宠物都会自动删除。

    关于android - 删除一对多关系 Room Kotlin 中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73589465/

    相关文章:

    android - Android 中的自定义文件扩展名

    java - 将 Retrofit 原始响应作为 json 对象返回而不转换为任何特定类型的对象?

    android - Android Jetpack Compose 中的图标和图像有什么区别?

    ios - 无法在多对多属性中加载核心数据

    java - Hibernate Lazy/Eager 列表总是通过新添加来获取整个列表

    android - 使用 zbar 为 Android 自定义相机 View

    java - 动态创建微调器

    android - 我们在 android 中有鼠标悬停事件吗?

    android - 如何公开 StateFlow 但启动和停止底层 Flow

    java - 消除 Hibernate 表中一对多关系引用的重复条目