首页 > 解决方案 > 使用 Swift 的 Sqlite3 数据库的问题

问题描述

我一直在试图弄清楚我的逻辑。我执行以下操作来打开我的数据库:

func createDB() -> OpaquePointer?{
        
    var db : OpaquePointer?
    
    guard sqlite3_open(path, &db) == SQLITE_OK else {
        print("error opening database")
        sqlite3_close(db)
        db = nil
        return nil
    }
    
    return db
}

然后我尝试执行以下select语句:

let queryString = "select photo_id from unsplash_photos"
        
var statement: OpaquePointer?

if(sqlite3_prepare_v2(db, queryString, -1, &statement, nil)) != SQLITE_OK {
    let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing select: \(errmsg)")
}

var rc = sqlite3_step(statement)

while rc == SQLITE_ROW {
    print("row",rc)
    
    rc = sqlite3_step(statement)
}

当它运行时,结果是每一步打印 100。

row 100
row 100
row 100
row 100
row 100
row 100
row 100
row 100
row 100

这与数据库的设置方式有关吗?这与桌子的位置有关吗?

标签: swiftsqlite

解决方案


是的,它告诉你它找到了 9 行数据,每次都返回SQLITE_ROW( )。100如果要提取数据,则必须调用sqlite3_column_xxx()以获取相应行的数据。例如,sqlite3_column_int如果photo_id是整数:

let queryString = "select photo_id from unsplash_photos"

var statement: OpaquePointer?

guard sqlite3_prepare_v2(db, queryString, -1, &statement, nil) == SQLITE_OK else {
    let errmsg = String(cString: sqlite3_errmsg(db)!)
    print("error preparing select: \(errmsg)")
    return
}

var rc = sqlite3_step(statement)

// as long as there's a row of data returned, display it

while rc == SQLITE_ROW {
    let id = sqlite3_column_int(statement, 0)
    print("id =", id)

    rc = sqlite3_step(statement)
}

// at the end, we should have gotten `SQLITE_DONE`, and if not, show the error

if rc != SQLITE_DONE {
    let errmsg = String(cString: sqlite3_errmsg(db)!)
    print("rc =", rc, "error = ", errmsg)
}

// clean up when we're done

sqlite3_finalize(statement)

推荐阅读