【问题标题】:FMDB insert or replace do multiple entriesFMDB 插入或替换做多个条目
【发布时间】:2020-12-09 09:40:55
【问题描述】:

我有一个 sqlite3 表,每次运行我的代码时,它都会添加多个条目。如何更改此查询以仅添加一个条目?

CREATE TABLE "GroupTable" (
    "id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "memberId"  TEXT NOT NULL,
    "adminId"   TEXT NOT NULL,
    "name"  TEXT NOT NULL
);

下面的方法展示了我是如何添加数据的:

func addDatatoList(info: ListModel ) -> Bool
    {
        sharedInstance.database!.open()
  
        let isInserted = sharedInstance.database!.executeUpdate("INSERT or REPLACE INTO GroupTable(adminId, memberId, name) VALUES (?,?,?)", withArgumentsIn: [ info.adminId,info. memberId,info.name])
        sharedInstance.database!.close()
        return isInserted
    }

【问题讨论】:

  • 您通常不必为每个 SQL 语句打开和关闭数据库。 SQLite 非常适合在您进行时提交对文件的更改...

标签: swift sqlite fmdb


【解决方案1】:

您没有提供 id 值,因此 INSERT OR REPLACE 永远不会替换。理论上可以添加id 参数,如果id 值为NULL,则传递NSNull()

func addDatatoList(info: ListModel) -> Bool {
    guard let db = sharedInstance.database else { return false }

    db.open()
    defer { db.close() }

    let sql = "INSERT or REPLACE INTO GroupTable(id, adminId, memberId, name) VALUES (?, ?, ?, ?)"
    let values: [Any] = [info.id ?? NSNull(), info.adminId, info.memberId, info.name]
    let isInserted = sharedInstance.database!.executeUpdate(sql, withArgumentsIn: values)

    return isInserted
}

话虽如此,如果您使用INSERT,您可能想要检索行的自动增量 id 值:

func addDatatoList(info: ListModel) -> Bool {
    guard let db = sharedInstance.database else { return false }

    db.open()
    defer { db.close() }

    let sql = "INSERT or REPLACE INTO GroupTable(id, adminId, memberId, name) VALUES (?, ?, ?, ?)"
    let values: [Any] = [info.id ?? NSNull(), info.adminId, info.memberId, info.name]
    let isInserted = sharedInstance.database!.executeUpdate(sql, withArgumentsIn: values)

    if isInserted, info.id == nil {
        let id = db.lastInsertRowId

        // e.g., if `ListModel` is a reference type and `id` is mutable, 
        // you might update the value, e.g.

        info.id = Int(id)
    }

    return isInserted
}

但是,话又说回来,如果您现在以编程方式确定是插入还是更新,则最好有两条 SQL 语句,一条用于INSERT,一条用于UPDATE

【讨论】:

  • 我的id是自动递增的,需要通过吗?
  • 另一种方法插入 1 值仅不适用于循环插入值
  • @9to5ios - “我的id 是自动增量的,需要通过吗?”如果您要插入记录,不,不需要。但是你正在做INSERT OR REPLACE,这表明如果它是一条新记录,你想INSERT,但如果它是更新现有记录,你想REPLACE。如果您要更新现有记录,那么显然您必须提供id,否则它将不知道您要替换的记录。 SQLite 足够聪明,如果idNULL,你想知道你想INSERT,但如果不是NULL,你想REPLACE
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多