【问题标题】:How to delete a list of rows from a table using composite primary keys in Sqldelight?如何使用 Sqldelight 中的复合主键从表中删除行列表?
【发布时间】:2021-06-16 10:38:11
【问题描述】:

在给定as_counter,t_ms 列表且列表中存在as_countert_ms 值的情况下,我想删除表中的行。

数据库

CREATE TABLE Event(
    as_counter TEXT NOT NULL,
    t_ms TEXT NOT NULL,
    event_map TEXT NOT NULL,
    PRIMARY KEY (as_counter, t_ms)
);


insertEvent:
INSERT OR REPLACE INTO Event (as_counter, t_ms, event_map)
VALUES (?, ?, ?);


deleteEventListByKey:
DELETE FROM Event
WHERE (as_counter,t_ms) IN (VALUES(?,?))

我尝试过的方法是在 deleteEventListByKey 中。但是我收到了 '(', ')', '.', <binary like operator real>, BETWEEN or IN expected, got ',' 的错误。我不确定为什么会收到此错误。

我正在尝试通过的测试用例

    @Test
    fun `delete events by list of primary keys`() {

        queries.insertEvent("1", "1", "{Click,Open}")
        queries.insertEvent("1", "2", "{Click,Close},{Read,Open}")
        queries.insertEvent("1", "3", "{Click,Open}")
        queries.insertEvent("2", "3", "{Click,Open}")
        queries.deleteEventsByKey([("1,2"),("1,1")])

        assertThat(queries.selectAllEvents().executeAsList())
            .containsExactly(
                Event(
                    as_counter = "1",
                    t_ms = "1",
                    event_map = "{Click,Open}"
                ),
                Event(
                    as_counter = "1",
                    t_ms = "2",
                    event_map = "{Click,Close},{Read,Open}"
                )
            )

    }

有谁知道如何为 SQLdelight(SQLLite) 编写查询,其中给定列表输入,如果数据库中存在 as_countert_ms,则删除表中的条目?

【问题讨论】:

    标签: android sqlite kotlin kotlin-multiplatform sqldelight


    【解决方案1】:

    这是 SQLdelight 的限制。我最终得到了以下解决方案:

    deleteEventListByKey:
    DELETE FROM Event
    WHERE as_counter || ',' || t_ms IN :countersAndMs
    

    并像这样使用它:

    .deleteEventListByKey(
        countersAndMs = listOf("1,2", "1,1")
    )
    

    或者一般情况下:

    .deleteEventListByKey(
        countersAndMs = events.map {
            "${it.as_counter},${it.t_ms}"
        }
    )
    

    这里发生了什么:对于 sql 中的每一行,您将一个字符串(在 sqlite '||' 将左右属性合并为一个字符串)与所有需要的属性进行比较,并将其与字符串列表进行比较,您必须以相同的方式填写。

    请注意,我使用 ',' 作为分隔符,但如果您的文本数据可能包含此符号,则应查找其他符号。

    这并不干净,因为我们失去了类型安全性,但我怀疑我们现在还能做些什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 2013-09-28
      • 1970-01-01
      • 2021-05-19
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多