【问题标题】:How to write an insert with an auto incremented index key value in swift sqlite3?如何在 swift sqlite3 中编写具有自动递增索引键值的插入?
【发布时间】:2020-06-29 16:02:33
【问题描述】:

我有以下 db 类,我希望列 indexKey 自动递增。它也应该是主键。 但是,每次我插入值时,每次读取的数据库查询中自动递增的字段都是 0。我错过了什么吗?请问有什么建议吗?

下面是我的数据库类;

class DbClass

{
var indexKey:Int = 0
var name = ""    
var indexNo:Int = 0

init(indexKey:Int, name:String, indexNo:Int)

{
    self.indexKey = indexKey
    self.name = name        
    self.indexNo = indexNo
}

}

下面是我的创建、插入和读取表

//创建表

    func createTable(){
    let createString = "CREATE TABLE IF NOT EXISTS dbclass(indexKey INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, indexNo INTEGER);"
    var createTableStatement: OpaquePointer? = nil
    if sqlite3_prepare_v2(db, createString, -1, &createTableStatement, nil) == SQLITE_OK
    {
        if sqlite3_step(createTableStatement) == SQLITE_DONE
        {
            print("dbclass table created.")
        } else {
            print("dbclass table could not be created.")
        }
    } else {
        print("CREATE TABLE statement could not be prepared.")
    }
    sqlite3_finalize(createTableStatement)

}

//插入表格

   func insert(cardNumber:String, name:String, indexNo:Int){

    let dbclass = read()
    for a in dbclass
    {
        if a.cardNumber == cardNumber
        {
            return
        }
    }
    let insertStatementString = "INSERT INTO dbclass (cardNumber, name, indexNo) VALUES (?, ?, ?);"
    var insertStatement: OpaquePointer? = nil

    if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {
        sqlite3_bind_text(insertCreditTransStatement, 2, (name as NSString).utf8String, -1, nil)            
        sqlite3_bind_int(insertCreditTransStatement, 3, Int32(indexNo))

        if sqlite3_step(insertStatement) == SQLITE_DONE {
                print("Successfully inserted row.")
            } else {
                print("Could not insert row.")
            }
        } else {
            print("INSERT statement could not be prepared.")
        }
        sqlite3_finalize(insertStatement)

}

//读表

    func read() -> [DbClass] {
    let queryStatementString = "SELECT * FROM dbclass;"
    var queryStatement: OpaquePointer? = nil
    var psns : [DbClass] = []

    if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK {
        while sqlite3_step(queryStatement) == SQLITE_ROW {
            let indexKey = sqlite3_column_int(queryStatement, 0)
            let name = String(describing: String(cString: sqlite3_column_text(queryStatement, 1)))
            let indexNo = sqlite3_column_int(queryCreditTransStatement, 2)

            psns.append(DbClass(indexKey: Int(indexKey), name: name, indexNo: Int(indexNo)))

            print("Query Result:")
            print("\(indexKey) |\(name) | \(indexNo)")
        }
    } else {
        print("SELECT statement could not be prepared")
    }
    sqlite3_finalize(queryStatement)

    return psns
}

内部视图控制器;

     var db:DBHelper = DBHelper()
     var dbclass:[DbClass] = []

我在视图控制器中的插入代码如下;

    self.db.insert(name: "abc", indexNo: 1)
    self.dbclass = self.db.read()
    print("DB Read")

【问题讨论】:

    标签: ios swift sqlite swift3 local-database


    【解决方案1】:

    创建表

    if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS Heroes (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, powerrank INTEGER)", nil, nil, nil) != SQLITE_OK {
            let errmsg = String(cString: sqlite3_errmsg(db)!)
            print("error creating table: \(errmsg)")
        }
    

    更多详情请点击链接https://www.simplifiedios.net/swift-sqlite-tutorial/

    【讨论】:

    • 建表成功,建表没有错误。问题在于自动增量。 indexKey INTEGER PRIMARY KEY AUTOINCREMENT 在插入值时总是为每条记录提供 0。
    猜你喜欢
    • 2019-01-09
    • 2012-02-03
    • 2016-11-06
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多