Sqldelight 1.4 如何在没有主键(id)的情况下插入填充数据生成对象

Posted

技术标签:

【中文标题】Sqldelight 1.4 如何在没有主键(id)的情况下插入填充数据生成对象【英文标题】:Sqldelight 1.4 how insert filled data generated object without primarykey (id) 【发布时间】:2021-04-28 00:43:03 【问题描述】:

我在 android 应用中将数据保存到 sqldelight 1.4 时遇到问题。

我创建了表格:

CREATE TABLE myTable(
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name TEXT
);

在 repo 类中,我有以 myTable 对象作为参数的插入函数

fun insert(item: myTable) 
     myTableQueries.insert( 
        name = item.name
     )

在某些操作中,我尝试创建具有名称但没有 id 的新对象表,因为 id 是自动递增的。 我没有找到任何信息如何做到这一点。 哪个是最好的解决方案?

    新建一个类(myTablexpress),参数与数据类(myTable)相同,在repo类的insert函数的参数中使用这个对象,并使用这些参数? 不在action类中新建myTable实例,而是使用insert函数,将字符串值作为参数?
myTableViewModel.insert(name)
    创建没有 id 的新类 myTable
@Parcelize
class myTable(val name: String) : Parcelable

在视图模型中使用参数?

    没有一个

谢谢

【问题讨论】:

【参考方案1】:

这里的 sqldelight 问题已经讨论了这个话题:https://github.com/cashapp/sqldelight/issues/1284

您可以在 .sq 文件中使用所有变量的 ? 参数定义您的 sqlite insert 语句,正如 sqldelight 的文档所述:https://cashapp.github.io/sqldelight/android_sqlite/

例子:

CREATE TABLE hockeyPlayer (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  player_number INTEGER NOT NULL,
  full_name TEXT NOT NULL
);

insert:
INSERT INTO hockeyPlayer
VALUES (?, ?, ?);

从您的 Kotlin 代码中,您可以将 null 传递给它的 id,这使得自动递增工作:

query.insert(
  id = null,
  player_number = 100,
  full_name = "name"
)

【讨论】:

以上是关于Sqldelight 1.4 如何在没有主键(id)的情况下插入填充数据生成对象的主要内容,如果未能解决你的问题,请参考以下文章

获取 sqldelight 中插入行的行 ID

使用 Sqldelight 更新对象数据

如何在 KMM 上为 SQLDelight 编写单元测试

SQLDelight:如何动态创建表?

如何在方形 sqldelight 中进行批量插入?

SqlDelight/SQLite 没有正确执行连接?