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

Posted

技术标签:

【中文标题】如何在方形 sqldelight 中进行批量插入?【英文标题】:How to do bulk insertion in square sqldelight? 【发布时间】:2017-03-28 11:21:26 【问题描述】:

感谢 Square 提供 SQLDelight 并为 sqlite db 交互提供类型安全的 api。我正在做如下单行插入:

      MyTable.Insert_row insert_row =
    new MyTableModel.Insert_row(
      mOpenHelper.getWritableDatabase(),
      MyTable.FACTORY
    );
  MyTable.bind(insert_row, data);
  insert_row.program.executeInsert();

有没有办法一次性批量插入数据列表?

【问题讨论】:

【参考方案1】:

有点。有两种方法。从 SQLite 3.7.11(包含在 android API 16 及更高版本中)开始,您可以从 sqlite 端一次插入多个值:

INSERT INTO myTable
VALUES (?, ?), (?, ?), (?, ?);

这可能不是你想要的。只要你只创建一次插入语句,绑定和执行多行实际上是非常快的:

MyTable.Insert_row insert_row =
    new MyTableModel.Insert_row(
      mOpenHelper.getWritableDatabase(),
      MyTable.FACTORY
    );
for (Row row : rows) 
  MyTable.bind(insert_row, row);
  insert_row.program.executeInsert();

这可能更接近你想要的。目前没有计划支持从 .sq 文件端进行任意大小的批量插入。

【讨论】:

您能否为最新版本的 SQLDelight 更新此答案?我正在尝试类似的东西,但性能很糟糕。 Room 花几秒钟的时间,比我愿意等待的时间还要长。我确定这是我插入的问题。

以上是关于如何在方形 sqldelight 中进行批量插入?的主要内容,如果未能解决你的问题,请参考以下文章

获取 sqldelight 中插入行的行 ID

如何将 sqldelight 中的新编译语句与 sqlbrite 一起使用?

使用 Sqldelight 更新对象数据

与 Room 相比,SQLDelight 性能较慢

在 KMM (prod) 中使用 SQLDelight 有啥限制

如何在 MySQL 中进行批量插入