gpt4 book ai didi

android - 房间中的多对多关系 CRUD

转载 作者:行者123 更新时间:2023-12-04 08:51:58 24 4
gpt4 key购买 nike

我已经根据文档和 medium article 模拟了与 Room 的多对多关系。 .使用这个@Relation,我可以从数据库中检索RecipeWithIngredients 或IngredientWithRecipe 对象。为此,我需要将一个配方插入到配方表中,然后将一个成分插入到成分表中,然后首先将它们的两个 ID 引用到引用表中。我认为除了在 Dao 上使用 @Transaction 并仅在一种方法上完成所有插入之外,没有另一种插入方式,但是对于删除和更新,我不应该也可以使用 Relation 来完成这些操作吗? Room 上的文档对我来说有点缺乏,所以我来找你
enter image description here

//Get for recipeWithIngredients object. (This works)
@Transaction
@Query("SELECT * FROM Recipe WHERE recipeID = :ID")
suspend fun getRecipeWithIngredients(ID:Long): RecipeWithIngredients

//Insert recipeWithIngredients object. (I don't see why this wouldn't work)
//IDs are autoGenerated so I can't get them until they are inserted

@Transaction
suspend fun insertRecipeWithIngredients(recipeWithIngredients: RecipeWithIngredients){
val recipeID = insertRecipe(recipeWithIngredients.recipe)

for(ingredient in recipeWithIngredients.ingredients){
val ingredientID = insertIngredient(ingredient)
insertRecipeIngredientRef(recipeID, ingredientID )

}
}

//I could try doing this like the insert but should't there be a way to do it like the get?
@Transaction
@Query("SOME SQL HERE")
suspend fun deleteRecipeWithIngredients(recipeWithIngredients: RecipeWithIngredients)

最佳答案

I don't think there is another way of doing insertion other than using @Transaction on the Dao and just doing it all on one method


您的想法由 insertRecipeWithIngredients 实现很有趣,我想它应该可以工作,但我不会说这是一种常见的方法。一般来说,多对多关系 - 当您有两个独立的实体时,即使它们之间没有关系( UserUserGroup 或例如),它们也具有值。即使在您的用例中,也可能是一个用户首先添加带有简短文本描述和所需步骤的食谱,然后另一个用户将配料绑定(bind)到它,所以 insertRecipeinsertRecipeIngredients应该分开做。
在这个模式中,你应该实现三个独立的 insert方法 - 首先为 Recipe , 第二为 Ingridient第三个 - RecipeIngridientRef .但是你当然在你的具体情况下你可以像上面描述的那样做。

for deletion and updating shouldn't I be able to do those using the Relation as well


开箱即用的 Room 不支持这一点。它仅用于查询。
如果为 删除 您想从 RecipeIngridientRef 中删除行引用特定配方,使用 Foreign Key 就足够了标准机制 - 级联删除。这样你只需要写 delete对于 Recipe 实体,其余的 Room&Sqlite 将为您完成。
至于 更新 文档中确实缺乏建议。一种选择 - 首先删除 RecipeIngridientRef 中的所有行。使用特定配方,然后使用相同的方法插入 RecipeIngridientRef (事务中的两个操作)。

关于android - 房间中的多对多关系 CRUD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64056460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com