• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iOS Swift Sqlite UNIQUE 约束失败

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:45:32 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

这是在我的第一个 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap