SQLDelight 关系
SQLDelight Relationships
我想为与 SQLDelight 的关系建模,尤其是 一对多 关系。
我有 2 个表:recipe
和 ingredient
。为简单起见,它们看起来像这样:
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 种成分。
我有两个目标:
- 写一个包含所有成分的食谱
- 阅读包含所有成分的食谱
我很确定第一个只能手动完成,例如插入食谱,然后手动插入相关配料。
对于后者,我尝试使用以下语句连接表:
selectWithIngredients:
SELECT *
FROM recipe
INNER JOIN ingredient ON recipe.id = ingredient.recipe_id
WHERE recipe.id=?;
SQLDelight 为我生成了一个 1:1 关系文件:
public data class SelectWithIngredients(
public val id: Long,
public val name: String,
public val recipe_id: Long,
public val name_: String,
)
有没有什么好的方法可以用一个生成的函数来检索数据(食谱+成分列表)?类似于 Rooms @Embedded
和 @Relation
注释。
遗憾的是,SQLDelight没有那么精美。它所做的只是为查询的每一行提供一个数据 class,如果你想做更复杂的逻辑,比如将一个 table 映射到另一个 table 的列表,那么你将需要自己在 kotlin 中完成。
例如有这样的食谱
data class Recipe(val name: String, val ingredients: List<String>)
您可以使用 select
val rows: List<SelectWithIngredients>
rows.groupBy { it.name }
.map { (recipe, selectRows) ->
Recipe(name, selectRows.map { it.name_ }
}
我想为与 SQLDelight 的关系建模,尤其是 一对多 关系。
我有 2 个表:recipe
和 ingredient
。为简单起见,它们看起来像这样:
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 种成分。
我有两个目标:
- 写一个包含所有成分的食谱
- 阅读包含所有成分的食谱
我很确定第一个只能手动完成,例如插入食谱,然后手动插入相关配料。
对于后者,我尝试使用以下语句连接表:
selectWithIngredients:
SELECT *
FROM recipe
INNER JOIN ingredient ON recipe.id = ingredient.recipe_id
WHERE recipe.id=?;
SQLDelight 为我生成了一个 1:1 关系文件:
public data class SelectWithIngredients(
public val id: Long,
public val name: String,
public val recipe_id: Long,
public val name_: String,
)
有没有什么好的方法可以用一个生成的函数来检索数据(食谱+成分列表)?类似于 Rooms @Embedded
和 @Relation
注释。
遗憾的是,SQLDelight没有那么精美。它所做的只是为查询的每一行提供一个数据 class,如果你想做更复杂的逻辑,比如将一个 table 映射到另一个 table 的列表,那么你将需要自己在 kotlin 中完成。
例如有这样的食谱
data class Recipe(val name: String, val ingredients: List<String>)
您可以使用 select
val rows: List<SelectWithIngredients>
rows.groupBy { it.name }
.map { (recipe, selectRows) ->
Recipe(name, selectRows.map { it.name_ }
}