首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLDelight关系

SQLDelight关系
EN

Stack Overflow用户
提问于 2021-08-03 07:53:51
回答 1查看 1.7K关注 0票数 4

我想用SQLDelight来建模关系,特别是到多个的关系。

我有两张桌子:recipeingredient。为了简单起见,它们如下所示:

代码语言:javascript
复制
CREATE TABLE recipe (
  id INTEGER NOT NULL PRIMARY KEY,
  name TEXT NOT NULL
)

CREATE TABLE ingredient (
  recipe_id INTEGER NOT NULL,
  name TEXT NOT NULL,
  FOREIGN KEY (recipe_id) REFERENCES recipe(id) ON DELETE CASCADE
);

所以我有一个食谱列表,每个食谱都可以包含0-n种成分。

我有两个目标:

  • 用它的所有成分写一份食谱
  • 阅读一份包含所有配料的食谱

我很确定第一个只能手动完成,例如插入食谱然后手动插入相关成分。

对于后一种情况,我试图用以下语句加入这些表:

代码语言:javascript
复制
selectWithIngredients:
SELECT *
FROM recipe
INNER JOIN ingredient ON recipe.id = ingredient.recipe_id
WHERE recipe.id=?;

SQLDelight为其生成1:1关系文件:

代码语言:javascript
复制
public data class SelectWithIngredients(
  public val id: Long,
  public val name: String,
  public val recipe_id: Long,
  public val name_: String,
)

有什么好的方法可以用一个生成的函数检索数据(配方+配料列表)吗?类似于房间 @Embedded@Relation注释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-07 09:24:01

不幸的是,SQLDelight并不那么精致。它所做的就是为查询的每一行提供一个数据类,如果您想执行更复杂的逻辑,比如将一个表映射到其他表的列表,而不是您自己在kotlin中需要这样做的话。

例如有这样的食谱

代码语言:javascript
复制
data class Recipe(val name: String, val ingredients: List<String>)

你可以通过你的选择来做到这一点。

代码语言:javascript
复制
val rows: List<SelectWithIngredients> 

rows.groupBy { it.name }
    .map { (recipe, selectRows) -> 
            Recipe(name, selectRows.map { it.name_ } 
    }  
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68632268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档