Как написать вставку с автоматически увеличенным значением ключа индекса в swift sqlite3? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть следующий класс БД, где я хочу, чтобы столбец 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")

1 Ответ

0 голосов
/ 18 марта 2020

создание таблицы

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/

...