OGeek|极客世界-中国程序员成长平台

标题: iOS Swift Sqlite UNIQUE 约束失败 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 19:45
标题: iOS Swift Sqlite UNIQUE 约束失败

这是在我的第一个 View Controller 中,它创建一个名为 event 的表并尝试插入一行。

我删除我的应用并安装。 然后我跑..

然后我的日志说:

失败:UNIQUE 约束失败:event.eid: INSERT INTO event (eid,passcode) VALUES (1,0);

表中什么都没有,它是空的。为什么它说我的唯一约束(主键)失败了?

它也会插入行,即使它抛出错误?

非常感谢您的帮助!

 ///////////////////////////
 //creating event table
    if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS event (eid INTEGER PRIMARY KEY, 
    eventid INTEGER NOT NULL DEFAULT 0, passcode TEXT NOT NULL DEFAULT '', 
    lastTicket INTEGER NOT NULL DEFAULT 0, online INTEGER NOT NULL DEFAULT 0, 
    onsale INTEGER NOT NULL DEFAULT 0, lastscanned INTEGER NOT NULL DEFAULT 0, 
    wasOffline INTEGER NOT NULL DEFAULT 0, eventOver TEXT NOT NULL DEFAULT '', 
    avatar INTEGER NOT NULL DEFAULT 0, devID TEXT NOT NULL DEFAULT '', 
    localScans INTEGER NOT NULL DEFAULT 0)", nil, nil, nil) != SQLITE_OK {


        let errmsg = String(cString: sqlite3_errmsg(db)!)
        log.error("error creating table: \(errmsg)")
    }

    var sqlString = "SELECT * FROM event WHERE eid=1"
    if(getCount(sqlString:sqlString)==0) {

        let sqlInserString = "INSERT INTO event (eid,passcode) VALUES (1,0);"
        log.verbose(runSQL(sqlString:sqlInserString))

    }///if eid!



func runSQL(sqlString:String) -> (String) {
  var sqlMessage = ""
  var sqlPointer: OpaquePointer? = nil

  if sqlite3_prepare_v2(db, sqlString, -1, &sqlPointer, nil) == SQLITE_OK {
      if sqlite3_step(sqlPointer) == SQLITE_DONE {
          sqlMessage = "Success: " + sqlString
      } else {
          let errmsg = String(cString: sqlite3_errmsg(db)!)
          sqlMessage = "Failure: \(errmsg): " + sqlString
      }
  } else {
      let errmsg = String(cString: sqlite3_errmsg(db)!)
      sqlMessage = "Not prepared: \(errmsg): " + sqlString
  }
  sqlite3_finalize(sqlPointer)

  return(sqlMessage)

}



Best Answer-推荐答案


eid被定义为eid INTEGER PRIMARY KEY,是一种特殊情况。该列将是 rowid 的别名,它具有隐含的 UNIQUE 约束,因为它旨在唯一地标识一行。

通常在插入行时您不会分配值,而是让 SQLite 分配值。

您的插入应该是:-

let sqlInserString = "INSERT INTO event (eid,passcode) VALUES (NULL,0);"

或:-

let sqlInserString = "INSERT INTO event (passcode) VALUES (0);"

eid 将是作为 INTEGER 的唯一标识符,最初为 1,然后可能为 2、3 等(请注意,不能保证它会大于 1 甚至更大(尽管它会更大,直到使用了可能的最高 id 9223372036854775807);因此,您应该只假设该值将是一个唯一的整数)。

关于iOS Swift Sqlite UNIQUE 约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48818466/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4