我想删除一对多关系中的所有值
父表:
@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.
要添加外键,请执行以下操作:
- 父类
@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/