问题描述
我有一个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
}
解决方法
您没有提供id
值,因此INSERT OR REPLACE
将永远不会替换。理论上,您可以添加id
参数,如果NSNull()
的值为NULL,则传递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)
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,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
。