SQLDelight 和 Kotlin 中具有一对多关系的数据类

And*_*ndy 6 android kotlin data-class sqldelight kmm

我正在尝试使用 Kotlin Multiplatform 创建一个小型应用程序,在其中我可以保存书名及其作者,但我正在努力解决数据类以及如何将它们映射在一起,以便我获得作者及其所有书籍和发布日期。

CREATE TABLE book(
id INTEGER NOT NULL,
name TEXT NOT NULL,
publishDate INTEGER NOT NULL,
authorId INTEGER NOT NULL
)

CREATE TABLE author(
id INTEGER NOT NULL,
name TEXT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

这是我的数据类:

@Serializable
data class bookEntity(
  id: Int,
  name: String,
  authorId: Int
)

@Serializable
data class authorEntity(
  id: Int,
  authorName: String
  books: List<bookEntity>
)
Run Code Online (Sandbox Code Playgroud)

和我的查询:

selectAuthors:
SELECT * FROM author
JOIN book ON book.authorId = author.id
WHERE book.authorId = author.id
Run Code Online (Sandbox Code Playgroud)

我尝试了以下映射,但它不起作用:

private fun mapAuthor(
  id: Int,
  authorName: String,
  bookId: String,
  name: String,
  publishDate: Long
): Author(
  return Author (
    id = id,
    authorName = authorName,
    book = List<BookEntity>(
      id = bookId,
      name = name,
      publishDate = publishDate
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

我如何处理这样的列表?感谢您的每一次帮助!

Sve*_*obs 0

theON子句JOIN是链接两个表的条​​件。您无需重复WHERE子句中的条件。用于WHERE进一步缩小查询范围,例如,如果您正在搜索特定的作者姓名。

SELECT * FROM author
JOIN book ON book.authorId = author.id
WHERE author.name LIKE 'John%';
Run Code Online (Sandbox Code Playgroud)

如果要查询所有作者,只需将其WHERE完全删除即可。

此外,您不需要自己创建数据类并进行映射。SQLDelight 已经为您的查询创建了数据类。